char str[6];
do
{
printf("Enter the string you wanna check:");
scanf("%s", str);
}
while(str != "exit");
爲什麼這個不行?錯誤字符串做而
char str[6];
do
{
printf("Enter the string you wanna check:");
scanf("%s", str);
}
while(str != "exit");
爲什麼這個不行?錯誤字符串做而
str
將從未等於"exit"
,因爲你比較兩個內存不同部分的地址。你可能想在內容的字符串,對其中有一個功能strcmp()
的比較。
如上所建議,使用strcmp
從<string.h>
頭文件。
char str[6];
do {
printf("Enter the string you wanna check:");
scanf("%s", str);
} while(!strcmp(str, "exit"));
"exit"
是在數據段地址的一些由編譯器產生的char[5]
。這個地址是從str
地址肯定是不同的,因爲兩個不同的對象不能佔用內存中的相同位置。
char[]
類型的表達式之間的操作者!=
比較兩個指針。這兩個指針的"exit"
地址和str
地址,其中,因爲我已經解釋過,將永遠是相等的。
因此,表達式str != "exit"
將永遠評估爲true
。這給我們帶來了另一個問題:你的編譯器應該發出一個關於這種情況總是錯誤的警告。這意味着你正在嘗試編程而沒有-Wall
。不要這樣做,你永遠不會走得很遠。始終使用最高級別的警告,當你看到警告,總是解決他們。
若要更正此問題,請按user3121023建議in a comment,並使用strcmp()
比較字符串。
嘗試:
#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;
}
簡短的回答是:它不起作用因爲您必須使用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;
}
定義「不行」 – dbush
當用戶輸入「退出」,循環不破。 –
你沒有比較字符串,而是指向'char'的指針。如已經建議的那樣,使用'strcmp()'。 –