c - Scanf 在循环中为标准输入取两个值,但只需要一个结束循环
问题描述
因此,此代码的要求之一是它从同一行扫描分数和名称,因此我将它们放在同一个 scanf 中,并且输入 q 将中断循环并停止输入。问题是当输入没有数字的 Q 时,它会在停止循环之前进行另一个输入。我可以做任何修复来完成这项工作吗?
while(entered_name[0] != 'Q' && entered_name[1] != 0)
{
scanf(" %s %d", entered_name, &new_score);
if(entered_name[0] == 'q')
{
entered_name[0] = toupper(entered_name[0]);
}
}
解决方案
您应该使用输入行,fgets()
因为scanf()
一旦实际输入与格式字符串中的预期不匹配,就会卡住。
然后第二次,您可以使用 分析获得的行sscanf()
。
结果给出了%
成功提取的数量(从左侧开始),因此您可以区分在此行上提供了一个或两个信息的情况。
/**
gcc -std=c99 -o prog_c prog_c.c \
-pedantic -Wall -Wextra -Wconversion \
-Wc++-compat -Wwrite-strings -Wold-style-definition -Wvla \
-g -O0 -UNDEBUG -fsanitize=address,undefined
**/
#include <stdio.h>
#include <string.h>
int
main(void)
{
char entered_name[100]="";
int new_score=-1;
while((strcmp(entered_name, "Q")!=0)&&
(strcmp(entered_name, "q")!=0))
{
char line[100];
if(fgets(line, sizeof(line), stdin)==NULL)
{
break; // cannot read standard input any more
}
int r=sscanf(line, "%s %d", entered_name, &new_score);
switch(r) // number of % extracted
{
case 1:
{
printf("entered name only: %s\n", entered_name);
break;
}
case 2:
{
printf("entered name and score: %s %d\n", entered_name, new_score);
break;
}
default:
{
printf("sorry, I didn't understand.\n");
}
}
}
return 0;
}
推荐阅读
- javascript - 我有一个要求,我应该有完整表格的垂直滚动条,但中间列的水平滚动条
- codeblocks - 代码错误!?为什么会有两个不同的答案?
- mysql - 在查询中更新具有相同随机值的多个列
- elixir - 使用结构时避免指定保护子句
- scala - 如何在Scala中弃用具有默认值的参数?
- python - pandas:在 df.pivot() 上绘制散点图会导致 KeyError
- ios - 如何区分表格视图中两个表格视图单元格之间的差距?
- javascript - 如何将对象列表转换为javascript中的对象数组?
- android - 拖放仅适用于第一个
- haskell - 必须为所有参数定义半群的运算符吗?