C语言 扫描字符导致 devC 出现问题



所以我的代码执行以下操作:

  1. 询问有什么选择
  2. 如果选项为 1:扫描一些号码
  3. 如果选项为 2:打印这些数字
  4. 在每个选项之后,询问用户是否要继续选择 (是/否(

这是我的主要代码

while(yesnocheck==1)
{
printf("What's your option?: ");
scanf("%d",&b);
switch(b){
case 1:
printf("How many numbers?: ");
scanf(" %d",&n);
a=(struct sv*)malloc(n*sizeof(struct sv));
for(int i=0;i<n;i++)
scanf("%d",&((a+i)->num));
break;
case 2:
for(int i=0;i<n;i++)
printf("%dn",(a+i)->num);
break;
}
yesnocheck==yesnochecker();
}

这是yesnochecker功能:

int yesnochecker()
{
char yesorno;
printf("Do you want to continue? (Y/N)");
while(scanf("%s",&yesorno))
{
if(yesorno=='Y')
return 1;
if(yesorno='N')
return 0;   
printf("*Wrong input. Please reenter (Y/N): ");
}
}

因此,在开发C++上,我的代码将无法正常运行。完成后,选项1,当我输入"Y"然后选择选项2时,情况2将显示一些奇怪的数字。但是,它在在线 C 编译器上运行良好。

然后,当我将 yesnochecker(( 函数中的char yesorno更改为char yesorno[2]并将其视为字符串时,代码确实有效。

有人能说出一些信息吗?

阅读带有scanf("%s", &c);char c是个坏主意。"%s"需要一个缓冲区来存储字符串。唯一适合char的字符串是一个空字符串(仅由终止符''组成 - 不是很有用(。每个包含 1 个字符的字符串需要 2char秒的存储空间 – 1 个用于字符,1 个用于终止符 (''(。提供存储char是未定义的行为。

因此,第一个提示是使用正确的格式化程序代替 –"%c".

这更好,因为它删除了未定义的行为。但是,它不能解决另一个问题,如以下示例所示:

#include <stdio.h>
int cont()
{
char c; do {
printf("Continue (y/n): ");
scanf("%c", &c);
printf("Input %cn", c);
} while (c != 'y' && c != 'n');
return c == 'y';
}
int main()
{
int i = 0;
do {
printf("Loop iteration %d.n", ++i);
} while (cont());
/* done */
return 0;
}

输出:

Loop iteration 1.
Continue (y/n):y↵
Input 'y'
Loop iteration 2.
Continue (y/n): 
Input '
'
Continue (y/n):n↵
Input 'n'

在 ideone 上进行现场演示

咦?

scanf("%c")使用输入中的一个字符。另一个字符(为ENTER键插入(保留在输入缓冲区中,直到下次调用任何输入函数。

太糟糕了,没有ENTER很难在控制台上确认输入。

一种可能的解决方案是读取字符,直到收到ENTER键(或由于任何原因输入失败(。(顺便说一句,getc()fgetc()也可以用来读取单个字符。

#include <stdio.h>
int cont()
{
int c;
do {
int d;
printf("Continue (y/n): ");
if ((c = fgetc(stdin)) < 0) {
fprintf(stderr, "Input failed!n"); return 0;
}
printf("Input '%c'n", c);
for (d = c; d != 'n';) {
if ((d = fgetc(stdin)) < 0) {
fprintf(stderr, "Input failed!n"); return 0;
}
}
} while (c != 'y' && c != 'n');
return c == 'y';
}
int main()
{
int i = 0;
do {
printf("Loop iteration %d.n", ++i);
} while (cont());
/* done */
return 0;
}

输出:

Loop iteration 1.
Continue (y/n):y↵
Input 'y'
Loop iteration 2.
Continue (y/n):Hello↵
Input 'H'
Continue (y/n):n↵
Input 'n'

在 ideone 上进行现场演示

请注意,我将读取字符的类型更改为int。这是因为getc()/fgetc()返回一个int,该能够存储 256 个可能的char值中的任何一个,以及在失败时返回-1

但是,将int与字符常量进行比较(例如'y'(。在 C 中,字符常量的类型只是int(SO:字符常量的类型(。

最新更新