2015-12-08 149 views
0

我必须拆分一个字符串输入值,其中有一个空格并输出结果。在数组中拆分字符串值

例如:输入:

I am a noob at C 

输出:

>>I 
>>am 
>>a 
>>noob 
>>at 
>>C 

代码:

void splitText(){ 
     char str[100]; 
     char sep[] = " \r\n"; 
     char *res; //if i remove this 
     fgets(str,sizeof str,stdin); 

     if (fgets(str, sizeof str, stdin) == NULL) { 
      printf("error"); 
     } 
     char *p = strchr(str, '\n'); 
     if (p) *p = 0; 
     res = strtok(str, sep); //and this 
     printf("%s\n",res); //and change this to str 


} 

工作码的人遇到了同样的问题:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void splitText() { 
    char str[100]; 
    char sep[] = " \n"; 
    char *res; 
    fgets(str,sizeof str, stdin); 
    if (fgets(str, sizeof str, stdin) == NULL) { 
     printf("Error"); 
     break; 
    } 

    res = strtok(str, sep); 
    while(res != NULL){ 
    printf("Splitted String: \"%s\"\n",res); 
    res = strtok(NULL,sep); 
    } 

} 

感谢大家帮助我解决这个问题!

+1

'焦炭海峡[100] =的scanf( “%s” 时,STR);',你在哪里读的? – Haris

+1

'scanf()'返回一个整数,并且将它分配给一个char数组 'scanf(“%s”,str)'将完成您的工作,只需删除左侧部分 –

+0

无论何时您对特定函数去阅读它。学习函数返回什么或在这种情况下它如何存储值可能会节省您很多时间和麻烦 – Talaria

回答

3

char str[100] = scanf("%s",str); 

的问题是,你是一个char阵列分配一个int

scanf()返回成功扫描的项目数。字符的实际读数由scanf()本身完成。所以你只需要分别拨打scanf()

if (scanf("%s",str) != 1) { /* error */} 

scanf()既然你想读一整行是不正确的工具在这里。 scanf()将在第一个空白处停止(在读取非空白字符后)。

因此,当您输入"I am a noob at C"时,scanf()将只会读取I并忽略其余部分。

你想要的是使用fgets()函数读取一行:

char str[100]; 

    if (fgets(str, sizeof str, stdin) == NULL) { 
    /* error */ 
    } 

/* rest of the code */ 

fgets()会读取新行,以及如果有一个在缓冲空间。如果这是不可取的,那么你可以将其删除:

char *p = strchr(str, '\n'); 
if (p) *p = 0; //remove the trailing newline. 

注:strtok()不是线程安全的功能。 POSIX提供strtok_r()作为线程安全的选择。即使在这种特殊情况下无关紧要,也应该注意这一点。


这里是一个自包含的例子:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) { 
    char str[100]; 
    char sep[] = " \n"; 
    char *res; 

    if (fgets(str, sizeof str, stdin) == NULL) { 
    exit(1); 
    } 

    res = strtok(str, sep); 
    while(res != NULL){ 
    printf("Splitted String: \"%s\"\n",res); 
    res = strtok(NULL,sep); 
    } 

    return 0; 
} 
+0

是的,但是你可以通过定义'char sep [] =“\ r \ n”来忽略'newline';'让strtok()'完成工作。 –

+0

感谢您的解决方案,但是,如果输入是“我是”的输出成为“我是”没有新行:/ – Joel

+0

@WeatherVane我提到它,因为这是一个相关的事实'fgets()'这往往是一个源误解'fgets()'。 –

2

那不是scanf()的工作原理。

更改代码

char str[100]; 
scanf("%s",str); 

一张小纸条约scanf()

您应该检查返回值,喜欢这里的scanf()

if (scanf("%s", str) != 1) 
{ 
    printf("scanf failed"); 
    exit(0); 
} 


您还应该提到的 char的数目,以通过 scanf()读取,以避免缓冲区溢出。

scanf("%99s", str) 

对于大小100char str[100],应该给予99保持地方空字符\0


+0

所以我不能立即声明scanf到str?我懂了。 – Joel

+0

你在你的scanf中忘记了这个'&'? –

+0

@HemantParihar我不需要&因为它已经是一个数组了。 – Joel