0

我正在尝试在 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],向前移动它会在不允许用户键入名称的地方为书名打印一个空格。

4

3 回答 3

2

char只为一个字符提供空间。同样,我相信%c只读取一个字符。

您要么将其更改为足够大的字符数组以保存书名,要么将其更改为char *并用于malloc获取内存来存储名称。

于 2012-04-23T09:04:30.800 回答
2

这是您不应该依赖scanf()输入的原因之一,因为错误的输入可能会搞砸一切。我不确定您之前使用的是什么编译器,但这段代码不应该在任何符合标准的 c 编译器中工作。

读取或打印字符串时,必须使用格式标签%s%c仅代表单个字符,因此输入任何长于一个字符的名称将搞砸所有输入请求(除非处理得当,例如通过 flushing stdin)。

以类似的方式,您的name成员可能只存储一个字符,而不是完整的名称。将其更改为数组,例如char name[64]. 确保它足够长以存储完整名称(并避免缓冲区溢出)。

可能还有其他错误,但我认为这些是最重要的错误,使您无法发现任何其他问题(如果有的话)。

编辑:尝试了代码并且由于换行符(从点击返回)仍然坐在stdin. 当读取一个整数或浮点数时,它会被跳过(由于没有形成有效的输入),但它被接受%c(没有检查它,但如果你这样做了,你应该注意到读取的值应该等于\n)。

To fix this, always call fflush(stdin); after you've read using scanf(). Doing it right before reading the character should be enough, but it's still a bit error prone.

于 2012-04-23T09:06:47.213 回答
-1

除了 SJuan76 指出的基本问题之外,它可能会更好地工作,并且如果您结束行更容易阅读:

printf("name of book %d:\n", i + 1);
于 2012-04-23T09:05:31.593 回答