2017-08-02 40 views
-1
char str[6]; 

do 
{ 
    printf("Enter the string you wanna check:"); 
    scanf("%s", str); 

} 
while(str != "exit"); 

爲什麼這個不行?錯誤字符串做而

+1

定義「不行」 – dbush

+0

當用戶輸入「退出」,循環不破。 –

+3

你沒有比較字符串,而是指向'char'的指針。如已經建議的那樣,使用'strcmp()'。 –

回答

5

str從未等於"exit",因爲你比較兩個內存不同部分的地址。你可能想在內容的字符串,對其中有一個功能strcmp()比較。

0

如上所建議,使用strcmp<string.h>頭文件。

char str[6]; 

do { 
    printf("Enter the string you wanna check:"); 
    scanf("%s", str); 
} while(!strcmp(str, "exit")); 
4

"exit"是在數據段地址的一些由編譯器產生的char[5]。這個地址是從str地址肯定是不同的,因爲兩個不同的對象不能佔用內存中的相同位置。

char[]類型的表達式之間的操作者!=比較兩個指針。這兩個指針的"exit"地址和str地址,其中,因爲我已經解釋過,將永遠是相等的。

因此,表達式str != "exit"永遠評估爲true。這給我們帶來了另一個問題:你的編譯器應該發出一個關於這種情況總是錯誤的警告。這意味着你正在嘗試編程而沒有-Wall。不要這樣做,你永遠不會走得很遠。始終使用最高級別的警告,當你看到警告,總是解決他們

若要更正此問題,請按user3121023建議in a comment,並使用strcmp()比較字符串。

0

嘗試:

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

int main() { 

    char str[6]; 

    do 
    { 
     printf("Enter the string you wanna check:"); 
     scanf("%s", str); 

    } 
    while(strcmp(str, "exit") != 0); 

    return 0; 
} 
2

簡短的回答是:它不起作用因爲您必須使用strcmp(str, "exit")琴絃和環比較爲只要strcmp()返回值不爲0

長的答案是:有更多的問題,在這個小的代碼片段:

  • 的一個你讀的單詞很短,你不會限制字符數scanf()可能存儲在那裏。任何超過5個非空格字符的用戶輸入都會導致未定義的行爲。

  • 您不檢查返回值scanf()。文件過早結束(例如重定向來自空文件的輸入)將導致無限循環。

這裏是如何的代碼可以在一個更安全的方式來寫:

#include <stdio.h> 

int main(void) { 
    char str[80]; 

    for (;;) { 
     printf("Enter the string you wanna check:"); 
     if (scanf("%79s", str) != 1 || strcmp(str, "exit") == 0) 
      break; 
    } 
    return 0; 
}