2014-02-17 61 views
1

我是一個新的C程序員,所以你將不得不原諒我缺乏知識。慢慢地,但我確定我正在改善。我想知道爲什麼我不能使用下面的代碼嘗試去除fgets在抓取用戶輸入時引入的'/ n'。它在第一次印刷聲明後中斷。我覺得我正在做一些危險的事情,但我不確定是什麼。爲什麼我不能用strtok()以下面的方式使用strcpy()

if (fgets(rawCommand, sizeof (rawCommand), stdin)) { 

    printf("\nTest: %s\n", rawCommand); //test print 
    strcpy(rawCommand, strtok(rawCommand, '\n')); //to get rid of the '\n' that fgets introduces 
    rawCommand[ strlen(rawCommand) - 1 ] = '\0'; 
    printf("\nTest: %s\n", rawCommand); //test print 

所有建議表示讚賞,但請保持建設性。謝謝。

+3

1.不能保證'fgets()'返回的行以換行符結束。不管怎樣,'strcpy'不是這樣做的。只需在字符串末尾尋找換行符,並且如果找到**,則設置爲0.在重疊緩衝區上的「strcpy()」調用*未定義行爲*。並且檢查'fgets()'沒有返回NULL。你會很驚訝,現在很多人都忽略了這一點。 – WhozCraig

+0

,應該是'strtok(rawCommand,「\ n」),'第二個參數需要'char *',而不是'char'。 – BLUEPIXY

回答

0

您的大部分代碼都是正確的。但是不需要strcpy()strtok()。拋出了潛在換行符考慮這個問題:

size_t len = strlen(rawCommand); 
if (len && rawCommand[len-1] == '\n') 
    rawCommand[len-1] = 0; 

,正如我在評論說。從fgets()返回NULL的好工作檢查。

+0

謝謝。這在刪除可能的'/ n'方面是有意義的。我知道我正在嘗試的東西有點可疑。 – TheCount

+0

另一個快速問題是0與'/ 0'相同? 0也可以作爲字符串終結符嗎? – TheCount

+0

Meant'\ 0' - 我的錯誤 – TheCount

相關問題