已知有声明“char ch;int a;”执行语句语句scanf (“% c % d” ,&ch,&a)如果从键盘输入的数据是123则变量a得到的值是
a = 23 , 1 被 %c 接收
%和c之间有空格,ch和a一个都没法正确赋值
不知道你这个问题是否已经解决, 如果还没有解决的话:应当输入数字,如果输入字母,scanf 语句执行失败。
int flag;
flag = scanf("%d",&n);
if (flag== 1) printf("good\n"); else printf("bad\n");
flag = scanf("%d",&n); 送返成功读入的数据个数。拍入字母,flag 得0,n 原有值不变。
由于输入流里的你拍入的字母 没有被清掉,后面的输入语句连续执行失败。可以用 fflush(stdin); 清除 多余的东西。
#include <iostream>
using namespace std;
int main(){
int tmp,t,a[1000],count=0;
while((t=scanf("%d",&tmp)) != EOF){
if(!t)
//scanf函数接收整型数字要跳过所有非数字的字符专接收数字。那么如果输入了字符它就一直留在输入缓冲区;
//只要缓冲区有字符,scanf就要去读,一读不是数字,它就跳过。
fflush(stdin);//此函数可以清除缓冲区中的字符
else
a[count++] = tmp;
}
for(int i=0; i<count; i++){
cout<<i+1<<"***"<<a[i]<<endl;
}
return 0;
}
————————————————
版权声明:本文为CSDN博主「liubin477」的原创文章,遵循 CC 4.0 BY-SA 版权协议。
原文链接:https://blog.csdn.net/qq_36668065/article/details/80154588
总结:用scanf("%d",&x);为变量赋值整数时,应用以下代码过滤:(这是原创不是转载)
while(!scanf("%d",&x)) //若输入的不是数字,返回0,知道输入的是数字为止 { printf("[Warining] You must input number!\n"); fflush(stdin); //输入的不是数字就清空缓冲区 }
养成一个每次用完scanf()函数时就清空缓冲区。以免影响程序的正常运行。 为此,自己编写了一个过滤非数字输入的scanf函数:
#define INT 1
int a; myScanfInt(INT,&a);
void myScanfInt(int datatype,int *p) { if(datatype==INT) while(!scanf("%d",p)) { printf("[Waring] You must input a number!\n"); fflush(stdin); } fflush(stdin); }
删除e69da5e6ba90e799bee5baa6e997aee7ad9431333337616635文件部分内容的大概步骤:新建一个临时文件,把原文件内容向临时文件里拷贝,遇到要删除的内容就跳过。结束后关闭文件,用remove("原文件名");把原
文件删除,用rename("临时文件名","原文件名");把临时文件名改为原文件名。2、例如在原文件123.txt中删除以2和以4编号开头的行,可用以下代码实现:
|
|
问题:当声明“char ch; int a;”并执行语句“scanf (“%c %d” ,&ch,&a)”时,如果从键盘输入123,变量a将获得什么值?
优化后的问题:在C语言中,使用scanf()函数输入字符和整数时,如何避免出现混乱或错误的输入,并确保得到正确的值?
解决方案: 1. 在使用scanf()函数读取字符或字符串之前,需要清空输入缓冲区以避免出现意外的字符或字符串:
while(getchar() != '\n');
这个循环会一直读取输入缓冲区中的字符,直到缓冲区为空,也就是读到了回车符为止。
scanf("%c %d", &ch, &a);
scanf("%c%*c%d", &ch, &a);