如何要求用户输入的scanf("%d",&num);必须是数字1.2.0啊,这里如果用户输入字符的话会进入死循环

Boya-00110 2019-01-13 03:37:59
#include<stdio.h>
#include<string.h>

int main(int argc, char*argv[])
{
char text[20],change[20];
int num;
int i;

while(1)
{
printf("输入数字1表示转成大写,2表示小写,0表示退出:\n");
scanf("%d",&num);
if(num==1){
printf("请输入要转换的大写:\n");
scanf("%s",&text);
strcpy(change,text);
strupr(change);
printf("转换成大写之后的字符为:%s\n",change);
}
else if(num==2){
printf("请输入需要转换成小写的字符:\n");
scanf("%s",&text);
strcpy(change,text);
strlwr(change);
printf("转换成小写之后的字符为:%s\n",change);
}
else if(num==0){
break;
}

}
return 0;
}
...全文
478 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin5161678 2019-01-14
  • 打赏
  • 举报
回复
引用 1 楼 独孤由过 的回复:

#include <stdio.h>

int main()
{
int num;
do
{
if (scanf("%d", &num) != 1)
fseek(stdin, 0, SEEK_END);
} while (num < 0 || num > 2);
printf("%d", num);
return 0;
}

之前的代码链接 没体现出问题
换一个代码连接
点开有惊喜
lin5161678 2019-01-14
  • 打赏
  • 举报
回复
引用 1 楼 独孤由过 的回复:

#include <stdio.h>

int main()
{
int num;
do
{
if (scanf("%d", &num) != 1)
fseek(stdin, 0, SEEK_END);
} while (num < 0 || num > 2);
printf("%d", num);
return 0;
}

真是不幸 踩雷了
stdin不能fseek
就算在你的运行环境可以
换一个运行环境可能就不行
这是地雷区 什么时候踩到地雷 怎么踩的都不知道

https://ideone.com/Qcq0WC
赵4老师 2019-01-14
  • 打赏
  • 举报
回复
再供参考:
#include <stdio.h>
int main() {
int IP[4];
int i;
char c;

printf("请输入一个ip地址:");fflush(stdout);
while (1) {
rewind(stdin);
if (5==scanf("%d.%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&IP[3],&c)) {
if (0<=IP[0] && IP[0]<=255
&& 0<=IP[1] && IP[1]<=255
&& 0<=IP[2] && IP[2]<=255
&& 0<=IP[3] && IP[3]<=255
&& '\n'==c) {
break;
} else printf("输入的ip地址格式不对!\n请重新输入:\n");
} else printf("输入的ip地址格式不对!\n请重新输入:\n");
}
for (i=0;i<4;i++) {
printf("IP[%d]=%d\n",i,IP[i]);
}
return 0;
}
赵4老师 2019-01-14
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
char s[80];
int i;
char c;
int main() {
while (1) {
printf("Input a integer:");fflush(stdout);
rewind(stdin);
fgets(s,80,stdin);
if (strlen(s)>10) {
printf("Input too long(>9)!\n");
continue;
}
if (2==sscanf(s,"%d%c",&i,&c)) {
if ('\n'==c) {
printf("%d is a integer.\n",i);
break;
}
}
if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;
printf("\"%s\" is NOT a integer!\n",s);
}
return 0;
}
自信男孩 2019-01-14
  • 打赏
  • 举报
回复
引用 2 楼 自信男孩 的回复:
因为%d匹配的是数字,如果输入1.2.0,那么'.'是不匹配%d。但是'.'不会从内存中刷走,而是还在输入缓存里,所以等下次循环时,scanf还是会匹配1.2.0,这样就一直死循环了。

建议判断scanf的 返回值,如果返回值不是1(因为%d只有一个),则清空输入缓冲区并让用户继续输入,
自信男孩 2019-01-14
  • 打赏
  • 举报
回复
因为%d匹配的是数字,如果输入1.2.0,那么'.'是不匹配%d。但是'.'不会从内存中刷走,而是还在输入缓存里,所以等下次循环时,scanf还是会匹配1.2.0,这样就一直死循环了。
_ZGq 2019-01-14
  • 打赏
  • 举报
回复
用char类型,char c=getchar(),如果c=='1'……,否则如果c=='2'……,否则如果c=='0'……,否则就不符合要求。
独孤过 2019-01-13
  • 打赏
  • 举报
回复

#include <stdio.h>

int main()
{
	int num;
	do
	{
		if (scanf("%d", &num) != 1)
			fseek(stdin, 0, SEEK_END);
	} while (num < 0 || num > 2);
	printf("%d", num);
	return 0;
}

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧