0

它第一次工作,第二次执行时,它会跳过第二个 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;
}
4

3 回答 3

1

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

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

exit 也是一个字符数组,而不是整数。将 exit 更改为 int 或将 scanf 更改为: scanf("%s",exit);。相信我exit对于C.

于 2013-02-14T09:06:27.713 回答
0

几个错误和备注:

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

有几个问题。

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

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

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

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

fgets(UserInput, sizeof UserInput, stdin);

我会怎么写。不要忘记检查返回值。

于 2013-02-14T09:19:08.350 回答