缓冲区-c语言 getchar()函数问题

问题描述

c语言 getchar()函数问题

#include
struct Stu {
int num;
char name[10];
char sex;
char job;
union c_p {
int b_class;
char postion[20];
}spec;
} person[2];
int main()
{
printf("enter data:
");
printf("*******************************************************
");
printf("注:姓名 学号 性别 工作 以enter键隔开!
");
for (int i = 0; i < 2; i++)
{
gets_s(person[i].name, 10);
scanf_s("%d", &person[i].num);
person[i].sex = getchar();
person[i].job = getchar();
if (person[i].job == 't' || person[i].job == 'T')
{
printf("postion: ");
gets_s(person[i].spec.postion,20);
}
else if (person[i].job == 's' || person[i].job == 'S')
{
printf("class: ");
scanf_s("%d", &person[i].spec.b_class);
}
else printf("
erro!!!!!!!!!!!!!");
}
for (int i = 0; i < 2; i++)
{
if (person[i].job == 't' || person[i].job == 'T')
printf("%d: %s %c %c %s
", person[i].num, person[i].name, person[i].sex, person[i].job, person[i].spec.postion);
else if(person[i].job == 's' || person[i].job == 'S')
printf("%d: %s %c %c %s
", person[i].num, person[i].name, person[i].sex, person[i].job, person[i].spec.b_class);
}
}

总数出错为什么 当我给person[i].sex输入参数时 结果程序认为我给person[i].job输入的参数 这是为什么 与缓冲区有关系么? 小白一名 谢谢大家的帮助

解决方案

这个问题很常见,主要原因出在 标准输入和键盘缓冲区的关系不清楚。
分析: scanf函数 从键盘缓冲区读取一个字符,转换为相应类型的数据存到变量中去,getchar函数也是。
具体:当你键入具体值时,例如:张三
11

教师
时,getchar函数此时给性别赋的值是第二个
,给职业赋值时就成了男,结果就成了上述问题。
解决方法:(1)在每个getchar前面加入 清除键盘缓冲区的函数 fflush(stdin),头文件是 stdlib.h (2) 每个getchar前面用一个字符处理掉
,char ch=getchar()就可以了。
希望有所帮助。

解决方案二:

C语言#getchar()函数
C语言getchar函数
杂记之C语言函数getchar()

解决方案三:

你程序里说用回车来区分字段,有个问题,就是回车会被getchar取到,你可能需要先getchar一次丢弃回车,再getchar读取字符

解决方案四:


scanf_s("%s", &person[i].name);

时间: 2024-10-04 00:32:24

缓冲区-c语言 getchar()函数问题的相关文章

关于getchar函数缓冲区的问题

最近,看到有同学问我关于getchar()这个函数缓冲区的问题,结合我以前的学习,我将对getchar()进行一次总结,当然,这些都是别人已经提过的东西,我只是总结,接下来我们来看看. 首先,用getchar()函数进行字符的输入,并不是直接从键盘这个硬件中读取输入的字符,而是从"输入缓冲区"中得到的字符.输入缓冲区是一个字符的队列,其中存储了所有你尚未读取的字符.每次调用getchar函数,它就会从输入缓冲区中读出第一个字符,并把这个字符从输入缓冲区中清除.然而,这个输入缓冲区的设计

c语言-C语言getchar不读取EOF问题

问题描述 C语言getchar不读取EOF问题 各位前辈,我的问题是,当我调试下面的c程序的时候,有一个不懂的地方在于: 右边输入了I am a student^Z(ctrl+z),但是当whilie循环中的c=getchar()在读完了c=t(最后一个字符t)之后,getchar就不继续读取了,即getchar不继续读取^Z了,也即while循环不退出,这是怎么回事.请各位大神解答,谢谢.. #include #include int getline(char *s, char lim) {

学点C语言(32):函数

C语言的函数可以返回数组以外(不包括数组指针)的任何类型. 不写明返回类型, 在以前的 C 语言版本中是默认返回 int, 现在 C99.C++ 已不支持. void 表示没有返回值, 也就无须 return 语句; 如果是其他语句必须有 return 语句. 在 main 函数中(只是 main 函数)若忘掉 return, 有些编译器会自动添加 return 0; 1. 每执行 return 语句函数将会退出: #include <stdio.h> int main(void) { pri

printf-为什么这样不对? 为什么一定要用getchar()函数吗?

问题描述 为什么这样不对? 为什么一定要用getchar()函数吗? int zm=0,sz=0,qt=0; char c; scanf("%c",&c); while(c!='n') { if(c>='0 '&& c <='9') sz++; else if((c>='A' && c<='Z') || (c>='a' && c<='z')) zm++; else qt++; } printf(

c语言getchar()putchar()问题

问题描述 c语言getchar()putchar()问题 最近在看 c第二版英译版.有个问题并不解. getchar()与putchar() 这是程序 int c; c=getchar(); while(c!='n') putchar(); 这里没有用fflush(stdin)函数清空,结果将无限循环显示. 而我用 while(c=getchar()!='n') putchar(c); 就不会循环. 请问各位大牛,这两个有什么区别,为什么结果就不一样? 解决方案 第一种写法,c永远是第一次输入的

测试-C语言getchar()为什么无法读取ungetch()返回的缓存字符

问题描述 C语言getchar()为什么无法读取ungetch()返回的缓存字符 在看K&R的逆波兰算法,发现里面用getch,把它改成getchar后发现无法读取ungetch返回缓冲区的字符而是直接读取下一个字符了.测试了一下 main() { int a,b,c; a=getchar(); ungetch(a); putchar(getchar()); while(1); } 输入23后发现返回的是3. ungetch返回的不是缓存吗,怎么读取不了呢? 解决方案 看了这段代码,深深地感觉自

C语言中函数的声明、定义及使用的入门教程_C 语言

对函数的"定义"和"声明"不是一回事.函数的定义是指对函数功能的确立,包括指定函数名,函数值类型.形参及其类型以及函数体等,它是一个完整的.独立的函数单位.而函数的声明的作用则是把函数的名字,函数类型以及形参的类型.个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致),它不包括函数体.--谭浩强 ,<C程序设计>(第四版),清华大学出版社,2010年6月,p182 这段论述包含了许多概念性错误,这

c-C语言调用函数实现矩阵自乘

问题描述 C语言调用函数实现矩阵自乘 各位前辈,小弟新学C语言,怎么也调试不过,不知道哪里出了问题,请问我该怎么调试? 调用void SelfMul(int A1[][3],int A2[][3],int n)实现3阶矩阵的乘法 #include //void SelfMul(int A1[][maxSize],int A2[][maxSize],int n) void SelfMul(int A1[][3],int A2[][3],int n) { int s=0; for(int i=0;i

用C语言编写函数计算子字符串substr在主字符串mainstr中的索引值

在大小写敏感的前提下,用C语言编写函数计算子字符串substr在主字符串mainstr中的索引值. 如果substr完全包含在mainstr中,请计算出索引值.否则,返回-1. 具体代码如下: findstr.c /** Author: snowdream <yanghui1986527@gmail.com> Data: 2012.03.05 Description: 假设一个主要字符串"Hello World!",和一个子字符串"World". 在大小