我正在尝试在Visual stuido中运行以下代码。请执行此代码,然后阅读我在此处输入的代码下面的经验。
#include <stdio.h>
#include <conio.h>
main()
{
int i;
struct book
{
char name;
float price;
int pages;
};
struct book b[3];
printf("Enter the names prices & no. of pages of 3 books \n");
for (i = 0; i<=2; i++)
{
printf("name of book %d : ", i +1);
scanf("%c", &b[i].name);
printf("price of book %d : ", i +1);
scanf("%f", &b[i].price);
printf("pages in book %d : ", i +1);
scanf("%d", &b[i].pages);
}
for (i = 0; i<=2; i++)
{
printf("Name of book : %c, Price of book: %f, Pages in book : %d \n", b[i].name, b[i].price, b[i].pages);
}
printf("Press any key to continue");
getch();
}
void linkfloat()
{
float a =0, *b;
b = &a;
a = *b;
}
正如你可以看到它询问用户书名,页面数和价格,但是当你在visual basic中运行代码时,它不允许为书b2向前键入名称,而它允许用户输入价格同一本书的页面编号为b [i],向前移动会为书籍名称打印一个空白区域,但不允许用户输入名称。
答案 0 :(得分:2)
char
仅为角色提供空间。同样,我相信%c
只会读取一个字符。
您要么将其更改为足以容纳图书名称的字符数组,要么将其更改为char *
并使用malloc
获取存储该名称的内存。
答案 1 :(得分:2)
这是您不应该依赖scanf()
输入的原因之一,因为错误的输入可能会搞砸所有内容。我不确定你之前使用过什么编译器,但是这个代码不适用于任何符合标准的c编译器。
在阅读或打印字符串时,您必须使用格式标记%s
。 %c
仅代表一个字符,因此输入任何长于一个字符的名称都会搞砸所有输入请求(除非处理得当,例如通过刷新stdin
)。
以类似的方式,您的name
成员可能只存储一个字符 - 而不是完整的名称。将其更改为数组,例如char name[64]
。确保它足够长以存储完整的名称(并避免缓冲区溢出)。
可能存在其他错误,但我认为这些是最重要的错误,使您无法找到任何其他问题(如果有的话)。
编辑:
尝试了代码和问题,因为换行符(来自点击返回)仍然位于stdin
。当读取一个整数或浮点数时,它被跳过(由于没有形成有效的输入),但它被%c
接受(没有检查它,但是如果你这样做,你应该注意到读取的值应该等于\n
)。
要解决此问题,请在使用fflush(stdin);
阅读后始终致电scanf()
。在阅读角色之前做正确应该就足够了,但它仍然有点容易出错。
答案 2 :(得分:-1)
除了基本问题之外,SJuan76指出它可能会更好,并且如果你结束你的话更容易阅读:
printf("name of book %d:\n", i + 1);