我正在尝试在 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] 的页码,向前移动它会在不允许用户键入名称的地方为书名打印一个空格。
最佳答案
这是您不应该依赖 scanf()
进行输入的原因之一,因为错误的输入可能会搞砸一切。我不确定您之前使用的是什么编译器,但此代码不应在任何符合标准的 c 编译器中运行。
读取或打印字符串时,必须使用格式标记%s
。 %c
仅代表单个字符,因此输入任何长于一个字符的名称都会搞砸所有随后的输入请求(除非处理得当,例如通过刷新 stdin
)。
以类似的方式,您的 name
成员可能只存储一个字符 - 而不是完整的名称。将其更改为数组,例如字符名称[64]
。确保它的长度足以存储完整的名称(并避免缓冲区溢出)。
可能还有其他错误,但我认为这些是阻止您发现任何其他问题(如果有的话)的最重要错误。
编辑:
尝试了代码,问题是由于换行符(从点击返回)仍然位于 stdin
中。当读取一个整数或 float 时,它被跳过(由于没有形成有效输入),但它被 %c
接受(没有检查它,但如果你这样做,你应该注意到读取的值应等于 \n
)。
要解决此问题,请始终在使用 scanf()
阅读后调用 fflush(stdin);
。在读取字符之前做这件事应该就足够了,但它仍然有点容易出错。
关于c - 用 C 编写的代码不适用于 Visual Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277550/