[英]Why does this while loop repeat after the user has entered input that is too long?
#include <stdio.h>
#include <ctype.h>
int stringLength (char *text)
{
int count = 0;
while (*text != '\0')
{
count++;
text++;
}
return count;
}
int main()
{
char str[25];
int length;
printf("Enter key: ");
scanf("%[^\n]", str);
length = stringLength(str);
while (length > 24)
{
printf("Enter key: ");
scanf("%[^\n]", str);
length = stringLength(str);
}
printf("your string is: %s and its %d long", str, length);
return 0;
}
無法弄清楚為什么while循環不斷重復。 代碼的重點是僅計算字符串的長度(包括空格)並給出結果。
我假設你在談論這個循環:
while (length > 24)
{
printf("Enter key: ");
scanf("%[^\n]", str);
length = stringLength(str);
}
轉換說明符%[^\n]
最多讀取字符,但不包括下一個換行符,將該換行符留在輸入 stream 中,這正是您想要的。 問題是%[
不會跳過前導空格,因此在下一次循環迭代中,它會從前一個輸入中看到\n
並立即返回而不讀取任何內容並保持str
不變。
解決此問題的最快方法是在格式字符串中放置一個前導空格 - " %[^\n]"
。 這將消耗並丟棄前一個操作中 stream 中留下的換行符和任何其他前導空格。
如果在格式上放置一個明確的字段寬度也是一個好主意,這樣您就不會冒緩沖區溢出的風險 - " %24[^\n]"
(需要為字符串終止符留出至少一個空格)。
您還應該檢查scanf
的返回值,即成功轉換和分配的次數。 在這種情況下,它應該是1
。 如果它是0
,那么你有一個匹配失敗並且str
沒有被修改。 如果它是EOF
,那么您要么遇到文件結束條件(如果您從文件重定向標准輸入或管道傳輸另一個程序的結果,則可能)或者 inpit stream 本身存在錯誤。
請注意,如果length
大於 24,那么您已經超出了緩沖區並進入了未定義行為的 realm。
問題來自scanf()
,因為它在最后留下了輸入。 下一個 function 循環以 enter 為掃描結束,因此它不加載任何內容。 這就是為什么當您傳遞超過 24 個字符的輸入時,您的代碼會一直循環。 您應該在scanf()
輸入之后立即使用getchar()
。
#include <stdio.h>
int stringLength (char *text)
{
int count = 0;
while (text[count] != '\0')
{
count++;
// text++;
}
return count;
}
int main()
{
char str[25];
int length;
do {
printf("Enter key: ");
scanf("%[^\n]", str);
getchar();
length = stringLength(str);
}
while (length > 24);
printf("your string is: %s and its %d long", str, length);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.