簡體   English   中英

為什么在用戶輸入太長的輸入后,這個while循環會重復?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM