结构程序给出了意外的输出

时间:2010-07-06 13:30:01

标签: c

/* It is not entering data into the third scanf() statement .*/

#include<stdio.h>
#include<conio.h>
#include<string.h>
void main(void)
{
    struct book
    {
        char name;
        int pages;
        float price;

    };
    struct book a1,a2,a3,a4;
    printf("Enter data into 3 books\n");
    scanf("%c %d %f",&a1.name,&a1.pages,&a1.price);
    scanf("%c %d %f",&a2.name,&a2.pages,&a2.price);
    scanf("%c %d %f",&a3.name,&a3.pages,&a3.price);
    printf(" you entered:\n");
    printf("\n%c %d %f",a1.name,a1.pages,a1.price);
    printf("\n%c %d %f",a2.name,a2.pages,a2.price);
    printf("\n%c %d %f",a3.name,a3.pages,a3.price);

    getch();
}

2 个答案:

答案 0 :(得分:4)

您想要使用字符串,而不是单个字符:

int main(void)
{
    struct book
    {
        char name[100];
        int pages;
        float price;

    };
    struct book a1,a2,a3,a4;
    printf("Enter data into 3 books\n");
    scanf("%s %d %f",&a1.name,&a1.pages,&a1.price);
    scanf("%s %d %f",&a2.name,&a2.pages,&a2.price);
    scanf("%s %d %f",&a3.name,&a3.pages,&a3.price);
    printf(" you entered:\n");
    printf("%s %d %f\n",a1.name,a1.pages,a1.price);
    printf("%s %d %f\n",a2.name,a2.pages,a2.price);
    printf("%s %d %f\n",a3.name,a3.pages,a3.price);

    return 0;
}

但请注意,这很容易出现缓冲区溢出,并且无法正确处理包含空格的书名。

答案 1 :(得分:2)

你想要一个字符串作为名字,而你正在为需要一个字符的输入提供一个%c说明符。

所以要么使用%s作为字符串输入。

或者更好地使用像gets()

这样的字符串函数
gets (a1.name);
scanf ( %d %f",&a1.pages,&a1.price);

再次提醒你必须小心字符串(char数组)的大小以避免堆栈溢出。

由于

Alok.Kr。