for里面的scanf语句不执行,赋值不成功

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了for里面的scanf语句不执行,赋值不成功相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<string.h>
#define N 3
#define M 3
struct Student
int num;
char name[20];
float score[3];
float total;
str[N];
main()

void inscore (struct Student a[],int i); //函数声明
int i,j;
printf("请按顺序输入学生的学号,姓名,数学、英语、C语言等信息:\n");
for(i=0;i<N;i++)
str[i].total=0;
scanf("%d",&str[i].num); //调试时,这里第一次循环的给输入,之后就再也不执行 →问题1
gets(str[i].name); //定义了 str[i].name[20],一定要输够20个字符回车才行→问题2
inscore(str,i);
for (j=0;j<3;j++)
str[i].total=str[i].total+str[i].score[j];

for(i=0;i<N;i++)
printf("num.%d%s:数学:%3lf,英语:%3lf,c语言:%3lf,总分:%3lf\n",str[i].num,str[i].name,str[i].score[0],str[i].score[1],str[i].score[2],str[i].total);


void inscore(struct Student a[],int i)
int j;
for(j=0;j<3;j++)
scanf("%lf",&a[i].score[j]);

编译连接0error 0warning,就是粗不来,给跪了

scanf只是模式匹配函数,当你输入学号并回车时,只有学号保存到了str[i].num,剩余一个换行符留在缓冲区;
gets函数不会跳过任意空白符,但当只要遇到换行符就会停止,并用空字符替换换行符

所以,你的gets函数根本就没有储存信息(它读取了上次遗留的换行符而终止了)

另外
scanf("%lf")中%lf是double类型的转换说明,你定义的结构体中却是float
gets函数现在已经不推荐使用,应用fgets替代

还有你的C代码很不标准,不符合c99

你试试在你的scanf代码下面加上:
while (getchar() != '\n')
;
参考技术A 在scanf前面一行加上
fflush(stdin); //清空键盘缓存
第二个问题没太明白,输完直接回车不行吗追问

nope

追答

回车按少了

参考技术B gets(str[i].name);
这个语句是以回车作为输入结束的,不会以空格作为结束。
请检查你输入分数前是否有换行输入。追问

还是不行啊,本来用scanf来赋值,只有第1次循环的时候才执行,后来才改成gets,结果还是一样

追答

scanf("%1f",&a[i].score[j]);

-->
scanf("%f",&a[i].score[j]);
多了一个1

PHP中如何判断SQL语句是不是成功执行?

你可以直接把执行SQL语句的函数执行的结果保存为变量,然后判断

例:我这里用的mysql_query函数哦:
<?php
///....坑爹的代码
$res=mysql_query($sql);
if($res)
echo '执行成功';
else
echo '执行失败';
?>

但是这样的执行成功只是你的语句正确的执行,但是不代表100%可以成功执行对数据库的操作,比如说你数据表里没有记录了,你执行delete语句,虽然成功了, 但是删除的行数是0,这是可能的。
参考技术A 用print_r输出一下数据,能输出就是成功执行拉。 参考技术B 我不知道SQL 我知道MYSQL; mysql_query('sql语句')函数能执行就返回结果集,不能则返回假,我想PHP中处理SQL的函数页有这功能,你测试一下有返回值没?

以上是关于for里面的scanf语句不执行,赋值不成功的主要内容,如果未能解决你的问题,请参考以下文章

c语言将字符输入至数组为啥不执行呢

for循环中,为啥不执行循环?

PHP中如何判断SQL语句是不是成功执行?

c语言中if语句条件为赋值语句

C语言赋值语句执行后返回数值不?

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