2014-10-30 95 views
0

我想disect以下字符串:子,並打印出來

char msg[30] ="Hello 13 1"; 
char *psh; 
int num1; 
int num2; 
char s[30],s[30]; 

我嘗試這一點,但:

pch = strtok (msg," "); 
while (pch != NULL) 
    { 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " "); 
    } 

,輸出:

Hello 
13 
1 

我只是想讓數字'13'等於num1,數字'1'等於num2:

printf("%d\n",num1); 

    Output: 13 


    printf("%d\n",num2); 

    Output: 1 

我嘗試:

sscanf(sc, "%s %d %d", &s, &num1, &num2); 

,其輸出:

Segmentation fault 

感謝

[編輯]

char * pch 
char s[30]; 
char sc[30]; 
char num1[30]; 
char num2[30]; 



pch = strtok (s," "); 
while (pch != NULL) 
{ 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " "); 
} 

sscanf(sc, "%s %d %d", pch, &num1, &num2); 
+0

不要對字符串使用address-of運算符('&'),它們已經是指針(或者在數組情況下會衰減指針)。 – 2014-10-30 11:43:32

+2

如果您以前從未嘗試過使用調試器,那麼現在是完美的時機。如果您在調試器中運行程序,它將停在崩潰位置。然後可以查看函數調用堆棧,甚至可以遍歷調用堆棧,以便最終獲得代碼(如果您不在那裏),然後檢查變量的值。至少,請使用調試信息(將'-g'標誌添加到'gcc')並在調試器中運行並編輯問題以包含'bt'調試器命令的輸出(它顯示函數調用堆棧,又名回溯)。 – 2014-10-30 11:46:10

回答

1

使用sscanf功能:

sscanf(msg, "%s %d %d", s, &num1, &num2); 

這將導致你的代碼看起來像這樣:

#include <stdio.h> 
int main() 
{ 
    char msg[30] = "Hello 13 1"; 
    int num1, num2; 
    char s[30]; 
    sscanf(msg, "%s %d %d", s, &num1, &num2); 
    printf("%d\n%d\n", num1, num2); 
    return 0; 
} 
+0

我編輯了與實際代碼 – user3035890 2014-10-30 11:50:48

+0

@ user3035890問題請參閱編輯的答案。 – Igor 2014-10-30 11:51:10

+0

在依賴具有適當值的變量之前,您應該檢查'sscanf()'的返回值。 – unwind 2014-10-30 11:53:03

1

如果你的代碼

pch = strtok (s," "); 
while (pch != NULL) 
{ 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " "); 
} 

sscanf(sc, "%s %d %d", pch, &num1, &num2); 

,那麼你必須undefined behavior,因爲你試圖寫一個NULL指針。

循環後,pch將爲NULL

此外,num1num2是字符數組(例如字符串),但您嘗試將數字提取爲整數。儘管數組足夠大以適應整數值,但如果您希望它們作爲實際整數,它仍然是錯誤的。

您還應該注意strtok修改輸入字符串。