用C编程的代码不适用于Visual Studio

时间:2012-04-23 08:59:24

标签: c visual-studio

我正在尝试在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],向前移动会为书籍名称打印一个空白区域,但不允许用户输入名称。

3 个答案:

答案 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);