C语言scanf语句导致无法进入循环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言scanf语句导致无法进入循环?相关的知识,希望对你有一定的参考价值。

c小白Q
这个程序是要记录影片,用的结构体和malloc动态内存分配
星号中间的就是问题语句,如果没有这个scanf,程序可以正常进入循环
代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 50
#define RAT 5
struct movie
char name[SIZE];
int rating;
;
void * s_gets(char *,int n);
int main()

int i=0,j,k;
struct movie *mov;
printf("输入你想录入的影片数量\n");
scanf("%d",&k);
mov=(struct movie *) malloc(k*sizeof(struct movie));
printf("输入你想录入的第一部影片名称\n");
while(i<k&&s_gets(mov[i].name,SIZE)!=NULL&&mov[i].name[0]!='\0')


printf("输入影片序号:");
scanf("%d",&mov[i++].rating);
while(getchar()!='\n')
continue;
puts("输入下一部影片名称:(empty line to stop):");

if(i==0)
printf("No data entered\n");
else
printf("Here is the movie list:\n");

for(j=0;j<i;j++)

printf("Movie: %s Rating: %d\n",mov[j].name,mov[j].rating);

printf("Bye\n");
return 0;


void * s_gets(char *ch,int n)

char *ret_val;
char *find;
ret_val=fgets(ch,n,stdin);
if(ret_val)

find=strchr(ch,'\n');
if(find)
*find='\0';
else
while(getchar()!='\n')
continue;

return ret_val;

问题已经解决,还是比较简单的。。。一个小问题而已。是scanf函数的问题。

我先贴图好吧,我运行的结果。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define SIZE 50

#define RAT 5

struct movie

char name[SIZE];

int rating;

;

void * s_gets(char *,int n);

int main()

int i=0,j,k;

struct movie *mov;

printf("输入你想录入的影片数量\\n");

scanf("%d",&k);

mov=(struct movie *) malloc(k*sizeof(struct movie));

printf("输入你想录入的第一部影片名称\\n");

while(i<k&&s_gets(mov[i].name,SIZE)!=NULL&&mov[i].name[0]!='\\0')


printf("输入影片序号:");

scanf("%d",&mov[i++].rating);

while(getchar()!='\\n')

continue;

puts("输入下一部影片名称:(empty line to stop):");

//printf("%s\\n",mov[0].name);

if(i==0)

printf("No data entered\\n");

else

printf("Here is the movie list:\\n");


for(j=0;j<i;j++)

printf("Movie: %s Rating: %d\\n",mov[j].name,mov[j].rating);


printf("Bye\\n");

return 0;


void * s_gets(char *ch,int n)

char *ret_val;

char *find;

fflush(stdin); //getchar();可选,最好用fflush函数;

ret_val=fgets(ch,n,stdin);

if(ret_val)

find=strchr(ch,'\\n');

if(find)

*find='\\0';

else

while(getchar()!='\\n')

continue;

return ret_val;

然后贴我的源码,就多了一行代码而已,在你的s_get函数里的fgets函数前面加了个fflush函数,位置,我已经加粗标明出来了。。。问题也很简单,就是在第一个scanf函数的时候,你是按了回车的,所以第二次使用scanf的时候,fgets直接吃掉了回车,这是我们不需要的,所以在这个之前,我们必须先把stdin输入流里的回车,清理掉,使用fflush函数一次清理了stdin输入流,等stdin输入流干净了之后,再调用fgets就不会出错了,当然也可以使用getchar函数把回车吃掉,不过比较麻烦,我一般喜欢用fflush函数,反正输入前,那些脏东西,我们不关心,也不需要,而且万一有多个呢,getchar只能清理一个脏东西,而fflush函数,直接全部冲掉,来的简单方便。。。。

问题解决,请采纳!不懂再问。

参考技术A 现象描述:在编写C语言程序时,需要使用scanf语句从键盘上输入一个整型的数时,当错误...造成死循环。 问题解决:可以在scanf语句后面加上getcha 参考技术B scanf("%d",&a); 应当键入数字,如果键入字母,scanf 语句执行失败,a当中未取得输入值,scanf函数返回0。 不一定是死循环,根程功编制的能有关。 有些情况,是由于输入流里的你键入的字母没有被清掉,后面的输入语句连续执行失败。可以用 fflus... 参考技术C 最佳答案:问题也很简单,就是在第一个scanf函数的时候,你是按了回车的,所以第二次使用scanf的时候,fgets直接吃掉了回车,这是我们不需要... 参考技术D scanf("%d",&a); 应当键入数字,如果键入字母,scanf 语句执行失败,a当中未取得输入值,scanf函数返回0。

不一定是死循环,根程功编制的能有关。

有些情况,是由于输入流里的你键入的字母没有被清掉,后面的输入语句连续执行失败。可以用 fflush(stdin); 清除多余的字符。

C语言中用scanf和循环语句是怎么给数组一一赋值的,希望说得详细点

#include <stdio.h>int main(void)

int name[10];
int n;
for (int i=0;i<10;i++)

scanf("%d",&n);//输入函数,后边的&n是说存入n的所在的地址
name[i] = n;//再把输入数据给数组
for (i=0;i<10;i++)

printf("%d\n",name[i]);

return 0;
参考技术A int i,a[100];scanf("%d",&n);for(i=0;i<n;i++) scanf("%d",&a[i]);就这样子即可 参考技术B 定义一个变量,从下标0开始,一直到N-1个为止。这就是输入和输出的循环 参考技术C 同样的,用for一个个赋值for(i=0;i<N;i++)scanf("%d",&a[i]);

以上是关于C语言scanf语句导致无法进入循环?的主要内容,如果未能解决你的问题,请参考以下文章

c语言:关于scanf()语句与while循环的问题

C语言中用scanf和循环语句是怎么给数组一一赋值的,希望说得详细点

c语言for循环无法正常执行?

c语言中用了scanf语句就输不出结果把scanf删掉就能出结果是为什么

c语言请问while循环为啥执行不了?

C语言基础