scanf("%f %f", &num1, &num2) != 2 解释这一句代码
时间: 2023-10-20 22:33:43 浏览: 76
这行代码使用了 scanf 函数,它的作用是从标准输入流中读取用户输入的数据,并将其存储到 num1 和 num2 两个变量中。"%f %f" 是 scanf 函数的格式字符串,它指定了要读取的数据类型为浮点数(即 float 类型)。此外,"%f %f" 中的空格表示 scanf 函数在读取数据时会忽略空格。
"!= 2" 是一个比较运算符,表示判断 scanf 函数是否成功读取了两个浮点数。如果 scanf 成功读取了两个浮点数,则返回值为 2,因此 "scanf("%f %f", &num1, &num2) != 2" 的意思就是:如果 scanf 函数没有成功读取两个浮点数,则执行后面的语句。也就是说,这行代码通常用于检测用户输入是否正确。
相关问题
创建动态链表并打印链表内容。要求通过键盘读入学生的学号和分数,当输入的学号为0时表示链表创建结束,并将读入的学生学号和成绩打印输出。下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。改错时不能改变程序原有的意图。 注意:将修改后的完整的源程序写在答题区内。 #include <stdio.h> #define SIZE sizeof(struct node) struct node { long num; float score; struct node *next; } int main() { int n = 0; struct node *head = NULL, *p1, *p2; p1 = p2 = (struct node*)malloc(SIZE); printf("Input %d node data:\n", n + 1); scanf("%d%f", &p1->num, &p1->score); while (p1->num != 0) { if (++n == 1) head = p1; else p2->next = p1; p1 = p2; p1 = (struct node*)malloc(SIZE); printf("Input %d node data:\n", n + 1); scanf("%d%f", &p1->num, &p1->score); } free(p1); printf("Prit list:\n"); p2->next = NULL; if (head != NULL) { p2=head; while (p1 != NULL) { printf("num:%d\tscore:%.2f\n", p1->num, p1->score); p1 = p1->next; } } return 0; }
修改后的程序如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define SIZE sizeof(struct node)
struct node {
long num;
float score;
struct node *next;
};
int main() {
int n = 0;
struct node *head = NULL, *p1, *p2;
p1 = p2 = (struct node*)malloc(SIZE);
printf("Input %d node data:\n", n + 1);
scanf("%ld%f", &p1->num, &p1->score);
while (p1->num != 0) {
if (++n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct node*)malloc(SIZE);
printf("Input %d node data:\n", n + 1);
scanf("%ld%f", &p1->num, &p1->score);
}
free(p1);
printf("Print list:\n");
p2->next = NULL;
if (head != NULL) {
p1 = head;
while (p1 != NULL) {
printf("num:%ld\tscore:%.2f\n", p1->num, p1->score);
p1 = p1->next;
}
}
return 0;
}
```
修改说明:
1. 缺少了头文件 `stdlib.h`,需要添加。
2. 在结构体定义之后缺少了分号。
3. `scanf` 函数中读入学生学号时,应该使用 `%ld` 而不是 `%d`。
4. 在链表的创建过程中,`p1` 赋值给 `p2` 时多余了一句 `p1 = p2;`,应该删除。
5. 在链表创建结束后,应该将最后一个节点的 `next` 指针设置为 `NULL`,即 `p2->next = NULL;`。
6. 在打印链表内容时,循环变量应该是 `p1` 而不是 `p2`。
void search(struct number *head) { struct number *p; long num1; int n=0,s=0; p=head; printf("\n请输入您要查找的数据:\n"); scanf("%ld",& num1); if(head!=0) for(;p->num!=0;p++) { n++; if(p->num==num1) { s=1; break; } } if(s==0) printf("\n没有您所要查找的数据\n"); else printf("\n找到您所需数据'%ld'在表中第%d个\n",num1,n);每一句的作用
这段代码实现了一个链表的查找功能。
1. `struct number *head`:链表头指针,指向链表的第一个节点。
2. `struct number *p`:链表节点指针,用于遍历链表。
3. `long num1`:要查找的数字。
4. `int n=0,s=0`:n表示当前节点在链表中的位置,s表示是否找到该数字。
5. `p=head`:将链表节点指针指向链表的第一个节点。
6. `printf("\n请输入您要查找的数据:\n");`:提示用户输入要查找的数字。
7. `scanf("%ld",& num1);`:输入要查找的数字。
8. `if(head!=0)`:如果链表不为空。
9. `for(;p->num!=0;p++)`:遍历链表,如果当前节点的数字不为0(链表以0结尾),则执行循环体。
10. `n++`:当前节点位置加1。
11. `if(p->num==num1)`:如果当前节点的数字等于要查找的数字。
12. `s=1`:标记已经找到数字。
13. `break`:退出循环。
14. `if(s==0)`:如果没有找到数字。
15. `printf("\n没有您所要查找的数据\n");`:输出提示信息。
16. `else`:如果找到了数字。
17. `printf("\n找到您所需数据'%ld'在表中第%d个\n",num1,n);`:输出数字在链表中的位置。
阅读全文