2015-12-08 214 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