2017-04-17 79 views
0

新手程序員學習C,我試圖用strcmp運行for-loop時遇到了這個'段錯誤(core dumped)'錯誤。我曾在類似的問題上看到過有關strcmp的問題,但他們似乎沒有解決我的問題。這是我寫的程序。strcmp for循環中的C分段錯誤

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

int main() { 
    char ftpstring[15]; 
    printf("\nEnter valid ftp command > "); 
    fgets(ftpstring,15,stdin); 

    const char* ftp[] = { "ascii", "recv", "send", "rmdir", "mkdir" , "pwd", "ls", "cd", "status", "quit" }; 

    for (int i = 0; i <= 10; i++) { 
    int comparison; 
    comparison = strcmp(ftpstring, ftp[i]); 
    if (comparison == 0) { 
     printf("%s is a valid ftp command.", ftpstring); 
     break; 
    } 
    if(i == 10) { 
     printf("%s is NOT a valid ftp command.", ftpstring); 
    } 
    } 
} 

正如你所看到的,這個程序會嘗試讀取用戶輸入,以確定它是否符合預定義的有效的FTP命令之一,然後返回它是否確實。

+4

'的for(int i = 0; I <= 10; i ++在)'應該是'對(int i = 0; i <10; i ++)' –

回答

1

for (int i = 0; i <= 10; i++)for (int i = 0; i < 10; i++)

ftp陣列包含10個字符串,所以環應該從09包括。

更一般的解決方案可以是

for (int i = 0; i < sizeof(ftp)/sizeof(ftp[0]); i++) 

但最好是定義宏

#define FTP_NUM_OF_COMMANDS 10 

並定義ftp陣列如下:

const char* ftp[FTP_NUM_OF_COMMANDS] = { "ascii", "recv", "send", "rmdir", "mkdir" , "pwd", "ls", "cd", "status", "quit" }; 

在這種情況下的編譯器還會驗證您是否不會使用超過10個值對其進行初始化(錯誤)。該for循環將是這樣的:

for (int i = 0; i < FTP_NUM_OF_COMMANDS; i++) 

另外請注意,下面的代碼應for

if(i == FTP_NUM_OF_COMMANDS) { 
    printf("%s is NOT a valid ftp command.", ftpstring); 
} 

i==FTP_NUM_OF_COMMANDS絕不會在循環本身中發生外移動,如果條件是truefor循環應該中斷。確保您在for循環範圍之外定義了i,以便在for循環中斷後可用。

+0

更好的辦法是做'sizeof(ftp)/ sizeof(ftp [0])' - 因爲那樣你就可以改變'ftp中元素的大小或類型'如果你沒有注意到這一行,不會導致錯誤。 – gilez

+0

@gilez同意!編輯。謝謝! –

+0

只是說,我寧願寫'for(int i = 0; ftp [i]!= NULL; i ++)' –

0

您正在對數組末尾進行比較:for循環應停在9處,而您的數據流經過數組的末尾。

使用10作爲「幻數」並不是一個好的選擇,要麼:compiler compute the size for you要好得多。最後,最好是使用索引在循環之後,以決定是否在命令已經發現或不:

int index = -1; 
for (int i = 0 ; i != sizeof(ftp)/sizeof(*ftp) ; i++) { 
    if (!strcmp(ftpstring, ftp[i])) { 
     index = i; 
     break; 
    } 
} 
if (index == -1) { 
    printf("%s is NOT a valid ftp command.", ftpstring); 
}