2013-04-12 129 views
0

只是與strtok和strcmp有點問題。strtok返回字符串?

我試圖通過與fgets一些預定要比較的字符串用戶的輸入:

char *token[100]; 

fgets(s, sizeof(s), stdin) 
token[0] = strtok(s, " "); // Get first word 
printf("tok: %s", token[0]); 
printf("cmp: %d\n", strcmp(token[0], "/bin/echo"); 

顯然,這是不是所有的代碼,但是這顯示了我的問題 - 如果我輸入「/斌/回聲。 ..「(或任何事情),它將被放入令牌[0]中,並打印出來。它打印正確,但是當它打印cmp值時,它從不爲0.對於/ bin/echo,出於某種原因,cmp值爲1。

謝謝。

編輯澄清混淆S和令牌:

char s[1024]; 
char *token[100]; 

EDIT 2 - 增加了一些其他的測試情況: 我輸入 「/斌/回聲世界你好」,以標準輸入

token[0] = strtok(s, " \n\0"); // Get first word 
printf("token[0] is: %s", token[0]); 
printf("cmp: %d\n", strcmp(token[0], "/bin/echo")); 

輸出:

token[0] is: /bin/echo 
cmp: 1 

然後我試着硬編碼字符串:

char str[] = "/bin/echo hello world"; 
token[0] = strtok(str, " "); 
printf("token[0] is: %s", token[0]); 
printf("cmp: %d\n", strcmp(token[0], "/bin/echo")); 

輸出:

token[0] is: /bin/echo 
cmp: 0 
+1

我們可以從編譯的代碼開始。 (在'fgets()'之後缺少半,沒有's'的聲明,在第二個'printf()'時沒有關閉paren,只是爲了命名我任意看到的那些)。然而,真正失蹤的部分是's'。最好是某種有效的內存緩衝區。 – WhozCraig

+2

這就是說,我修正並運行了這段代碼,聲明's'爲本地緩衝區'char s [100];'並且輸入代碼爲「/ bin/echo madness」。它運行良好,報告爲'0'作爲比較結果,所以無論你的問題是什麼,這個代碼不會展示它(超出編譯錯誤,無論如何)。 – WhozCraig

+4

我懷疑你輸入_only_'「/ bin/echo」'。然後你得到''/ bin/echo \ n''這個標記,因爲'fgets'包含換行符。 –

回答

0

使用

char token[1000]; 
strcpy(token,strtok(s," ")); 

串的不能在C :)

也直接這樣分配,包括string.h中

+3

這不僅是錯誤的,它的錯誤在它的聲音的頂部。閱讀['strtok()'](http://en.cppreference.com/w/c/string/byte/strtok)的文檔,然後查看token **指針數組**的* type *。 – WhozCraig

+0

不能將字符串複製到未初始化的內存。您需要首先分配內存。 – user206334

+2

@ user206334如果你理解了'strtok()'和它返回的結果,就不需要複製字符串*。 – WhozCraig

-1

需要動態分配內存進行復制字符串。閱讀關於動態內存管理第一(的malloc,釋放calloc,等...)

編輯: http://ideone.com/0UxEwO - 對我的作品

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

int main() 
{ 
    char s[1024]; 
    char *token[100]; 
    fgets(s, sizeof(s), stdin); 
    token[0] = strtok(s, " \n\0"); 
    printf("token[0] is: %s", token[0]); 
    printf("cmp: %d\n", strcmp(token[0], "/bin/echo")); 
} 
+0

Downvoter請解釋s是如何分配的?一個需要靜態指定數組大小或動態分配內存。不能簡單地使用char * s = fgets(...)。 – user206334

+0

我沒有對此投票,但是你在哪裏看到使用'char * s = fgets(...)'的OP?缺少任何's'是代碼中的許多錯誤之一,但沒有說它必須*被動態分配。它也可以是一個堆棧變量。 – WhozCraig

+0

對不起,可能應該顯示s和令牌正在初始化。添加到OP。 – Travv92

1

在這裏,我已經取得小程序

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

int main() 
{ 
char str[] ="/bin/echo this is something"; 
    char * token[100]; 
    token[0] = strtok (str," "); 

token[0] = strtok(str, " "); // Get first word 
printf("cmp: %d\n", strcmp(token[0], "/bin/echo")); 
return 0; 
} 

在這裏我靜態存儲輸入字符串,而不是fgets()

這工作正常。

請參閱http://codepad.org/IrGAXT8f

+0

剛剛試過這個,它的工作原理 - 唯一的問題是我需要從命令行輸入stdin,所以硬編碼str []不會工作不幸: – Travv92