printf("请输入书名\n");scanf("%s",p->book);//fgets(p->book,10,stdin);请解释下代码
时间: 2024-02-22 14:00:51 浏览: 19
这段代码是用来读取书名的。其中:
- `printf("请输入书名\n");` 是用来输出提示信息,告诉用户需要输入书名。
- `scanf("%s",p->book);` 是用来读取字符串输入的,`%s` 是用来匹配字符串的格式控制符,`p->book` 表示将输入的字符串存储到 `p` 指向的结构体变量中的 `book` 字段中。这种方式可以读取用户输入的任意长度字符串,但是可能存在缓冲区溢出等安全问题,因此建议使用 `fgets()` 函数来代替。
- `fgets(p->book,10,stdin);` 是用来读取字符串输入的,`p->book` 表示将输入的字符串存储到 `p` 指向的结构体变量中的 `book` 字段中,`10` 表示最多读取的字符数,`stdin` 表示从标准输入流中读取数据。相比于 `scanf()` 函数,`fgets()` 函数可以更好地处理输入字符串的长度,避免了缓冲区溢出等安全问题。但是需要注意的是,`fgets()` 函数会将输入中的换行符一并读取并存储,因此需要使用 `strcspn()` 函数来去除换行符。例如,可以使用以下代码来代替上面的 `scanf()` 函数:
```cpp
printf("请输入书名:\n");
fgets(p->book, sizeof(p->book), stdin);
p->book[strcspn(p->book, "\n")] = '\0'; // 去除换行符
```
相关问题
void addbook(Book booklist[]) { printf("请输入书籍序号:"); scanf("%s",bookList[numbooks].id); printf("请输入书名:"); scanf("%s",bookList[numbooks].name); printf("请输入作者:"); scanf("%s",bookList[numbooks].author); printf("请输入出版社名:"); scanf("%s",bookList[numbooks].press); bookList[numbooks].available = 1; numbooks++; printf("添加成功!\n"); }怎么改正
这段代码中有一个问题:函数的参数为`booklist[]`,但是在函数体内却使用了`bookList`,大小写不一致,导致编译器无法识别。另外,在输入字符串时应该使用`fgets`函数,以避免输入过长的字符串导致内存溢出。
下面是修改后的代码:
```c
void addbook(Book booklist[]) {
printf("请输入书籍序号:");
fgets(booklist[numbooks].id, MAX_ID_LEN, stdin);
printf("请输入书名:");
fgets(booklist[numbooks].name, MAX_NAME_LEN, stdin);
printf("请输入作者:");
fgets(booklist[numbooks].author, MAX_AUTHOR_LEN, stdin);
printf("请输入出版社名:");
fgets(booklist[numbooks].press, MAX_PRESS_LEN, stdin);
booklist[numbooks].available = 1;
numbooks++;
printf("添加成功!\n");
}
```
检查并修改c语言程序:给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。 输入格式: 输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。 输出格式: 在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。 输入样例: 3 Programming in C 21.5 Programming in VB 18.5 Programming in Delphi 25.0 输出样例: 25.00, Programming in Delphi 18.50, Programming in VB。#include<stdio.h> struct book { char name[50]; double pace; }; int main() { int n,i,j,k,m=0,x=0; struct book np[10]; scanf("%d",&n); for(i=0;i<n;i++) { //scanf("%s ",np[i].name); gets(np[i].name); scanf("%lf ",&np[i].pace); } double max=np[0].pace,min=np[0].pace; for(j=0;j<n;j++) { if(max < np[j].pace) max=np[j].pace; m=j; } // int m=j; for(k=0;k<n;k++) { if(min > np[k].pace) min=np[k].pace; x=k; } // int x=k; printf("%.2lf,%s \n",max,np[m].name); printf("%.2lf,%s",min,np[x].name); }
有以下几处需要修改:
1.在读入书名时,应使用 `fgets` 函数代替 `gets` 函数,因为 `gets` 函数存在安全隐患。
2.在读入价格时,应去掉输入格式字符串中的空格。
3.在寻找最高和最低价格的书时,应将最高价格和最低价格的初始化值设为 `np[0].pace`,而不是 0。
4.在寻找最高和最低价格的书时,应在循环内部更新最高和最低价格的下标,而不是在循环结束后更新,否则只会输出最后一本书的价格和名称。
修改后的代码如下:
```c
#include<stdio.h>
struct book {
char name[50];
double pace;
};
int main()
{
int n,i,j,m=0,x=0;
struct book np[10];
scanf("%d",&n);
getchar(); // 去掉换行符
for(i=0;i<n;i++)
{
fgets(np[i].name, 50, stdin); // 使用 fgets 读入书名
scanf("%lf",&np[i].pace); // 去掉空格
getchar(); // 去掉换行符
}
double max=np[0].pace,min=np[0].pace;
for(j=0;j<n;j++)
{
if(max < np[j].pace) {
max=np[j].pace;
m=j; // 更新最高价格的下标
}
}
for(int k=0;k<n;k++) // 将 k 的声明放在循环内部
{
if(min > np[k].pace) {
min=np[k].pace;
x=k; // 更新最低价格的下标
}
}
printf("%.2lf,%s\n",max,np[m].name); // 输出时去掉空格
printf("%.2lf,%s",min,np[x].name);
return 0;
}
```
注意,由于输入书名时使用了 `fgets` 函数,因此需要在读入价格之前去掉换行符。而在输出时,应该保留最后一行的换行符,否则会格式错误。
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)