2017-09-14 53 views
0

我正在嘗試使用「strtok」將用戶輸入分爲4個部分。所以一個例子字符串看起來像「約翰1.3 2.4 3」。strtok分割錯誤並存入變量?

我想存儲第一個字符數組,第二個和第三個作爲浮點變量,最後一個作爲整數。

起初我嘗試使用scanf並將變量存儲到所需的位置。 我被告知使用fgets和分割字符串更好。我的代碼如下所示:

char Input[4]; 
    char names[5]; 
    struct numbers 
    { 
     float start; 
     float end; 
     int rows; 
    }values; 

    fgets(Input, sizeof(Input), stdin); 
    token = strtok(Input, " "); 

    strcpy(names, token); 
    values.start = atof(strtok(NULL, " ")); 
    values.end = atof(strtok(NULL, " ")); 
    values.rows= atoi(strtok(NULL, " ")); 

輸入用戶輸入後出現分段錯誤。 我該如何解決這個問題? 只使用scanf會更好嗎?

+4

您必須放大輸入數組的大小。它只能保存4個字符。如果輸入的格式與您所描述的格式相同,則輸入的字符串將不適合。 –

+0

您是否可以複製粘貼您嘗試的實際代碼?你的結構定義是錯誤的。 –

+0

@MananVora它不是你的結構的成員,因爲它不在你的結構中。看起來像你的結構定義 - 它有兩個'結束' –

回答

1
char Input[40]; 
char names[5]; 
char *token; 
struct numbers 
{ 
    float start; 
    float end; 
    int rows; 
}values; 

fgets(Input, sizeof(Input), stdin); 
token = strtok(Input, " "); 

strcpy(names, token); 

values.start = atof(strtok(NULL, " ")); 
values.end = atof(strtok(NULL, " ")); 
values.rows= atoi(strtok(NULL, " ")); 

printf("%s\n %.1f\n %.1f\n %d",names,values.start,values.end,values.rows); 

增加Input數組的大小。

1

解決方案:請增加「輸入」的大小。

問題的原因:根據您的代碼「輸入」只能有四個 字符。因此,當輸入字符串超過4個字符時,「strtok」會嘗試 讀取超出邊界的數據,並可能導致分段錯誤。

+0

嗨,我試着增加輸入的大小,但它仍然給我一個段錯誤? –

+0

你能再次分享你的代碼嗎?嘗試100的大小 –