【问题标题】:C Scanf in a loop循环中的 C Scanf
【发布时间】:2013-02-14 09:05:13
【问题描述】:

第一次工作,第二次执行时跳过第二个scanf函数。从几页谷歌之后,注意到这是在缓冲中添加 \n 的 scanf 函数的行为,为了解决这个问题,我在 scanf 之后添加了 fflush(stdin) 并且它确实有效,但是当第二次执行时,它给我一个错误的结果。有人可以指导我这个程序的问题是什么?

#include <stdio.h>
#include <stdlib.h>

int main()
{
char UserInput[50];
int i = 0;
int exit;


do{


printf("Please enter a string (less than 50 character): ");
scanf("%[a-z,A-Z, ,]s",&UserInput);

while(UserInput[i] != '\0' && i<50)
{
    i++;
}

if (i==50)
    printf("The string is too long\n");
else
    printf("The length of the string is %d\n",i);

printf("To continue, please key in any numbers other than 0: ");
scanf("%d",&exit);
    fflush(stdin);
}while(exit !=0);

system("PAUSE");
return 0;
}

【问题讨论】:

  • 在您读取输入之后检查长度 几乎没有用。但是,您可以告诉scanf 最多获取特定数量的字符,其格式为"%50s"
  • 阅读 scanf 返回值的含义,并检查它是否存在解析错误...在排除使用 scanf 的任何代码的问题之前,没有多大意义无效输入(或无效格式字符串,取决于您的观点)的简单可能性。

标签: c


【解决方案1】:

您不使用 & 来读取数组。将行更改为:

scanf("%[a-z,A-Z, ,]s",UserInput);

exit也是一个char数组,不是整数。将 exit 更改为 int 或将 scanf 更改为:scanf("%s",exit);。相信我退出 is not a good name 以获取 C 中的变量。

【讨论】:

    【解决方案2】:

    有几个问题。

    计算长度的循环有点没有意义,而且它在运行一次后也不会重置i,所以它会在第二次尝试时中断。

    删除循环,如果您觉得必须计算长度,请改用strlen()

    更好的是,删除 sscanf() 的使用并改用 fgets()

    请注意,&amp;UserInput 有点毫无意义,名称 UserInput 将“衰减”为指向函数调用中第一个元素 (&amp;UserInput[0]) 的指针,这是说明它的最佳方式:

    fgets(UserInput, sizeof UserInput, stdin);
    

    我会这样写。不要忘记检查返回值。

    【讨论】:

      【解决方案3】:

      几个错误和备注:

      1. 当使用扫描集格式 (%[a-zA-Z ]) 时,您不应该像您一样在末尾使用 s,逗号也不应该在那里。
      2. 您应该在调用scanf 时检查返回码,以确保您确实成功读取了应该读取的内容。
      3. 您有溢出UserInput 缓冲区的风险 - 它只允许长度为 49 的字符串,但您在填充缓冲区时没有这样的限制。
      4. 您不会在每次迭代后将i 重置为0
      5. exit 应该具有 int 类型,因为您使用格式 %d 来填充它。正如其他地方所指出的,exit 在 C 中并不是一个特别好的变量名称(有一个标准函数称为 exit)。
      6. 您使用多个scanf 调用,而没有妥善处理读取前一次读取的任何剩余内容。最好将输入逐行(例如使用fgets)读入缓冲区,然后从该缓冲区中解析出您需要的数据。
      7. 不要在输入流上使用fflush(如stdin)。它仅适用于输出流。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 2016-05-18
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        • 2015-12-27
        • 2020-02-16
        • 1970-01-01
        相关资源
        最近更新 更多