c中意外终止程序

时间:2014-12-12 17:19:46

标签: c struct printf scanf

我是c的初学者。今天我遇到了一个问题。如果我们给出以下输入,按照书:

Enter names, prices and no. of pages of 3 books 

A  100.00  354 
C  256.50  682 
F  233.70  512 

输出将如下所示

And this is what you entered 

A  100.000000  354 
C  256.500000  682 
F  233.700000  512 

在跑步时突然终止。

代码如下:

#include<stdio.h>
#include <ctype.h>
main( ) 
{ 
    struct book 
    {   
    char  name ; 
    float  price ; 
    int  pages ; 
    } ; 
    struct book  b1, b2, b3 ; 

    printf ( "\nEnter names, prices & no. of pages of 3 books\n" ) ; 
    scanf ( "%c %f %d", &b1.name, &b1.price, &b1.pages ) ; 
    scanf ( "%c %f %d", &b2.name, &b2.price, &b2.pages ) ; 
    scanf ( "%c %f %d", &b3.name, &b3.price, &b3.pages ) ; 

    printf ( "\nAnd this is what you entered" ) ; 
    printf ( "\n%c %f %d", b1.name, b1.price, b1.pages ) ; 
    printf ( "\n%c %f %d", b2.name, b2.price, b2.pages ) ; 
    printf ( "\n%c %f %d", b3.name, b3.price, b3.pages ) ; 
} 

2 个答案:

答案 0 :(得分:6)

只需在%c之前放置空格,这样如果缓冲区中有\n,则无法读入。

所以这应该有效:

scanf(" %c %f %d", &b1.name, &b1.price, &b1.pages);
scanf(" %c %f %d", &b2.name, &b2.price, &b2.pages);
scanf(" %c %f %d", &b3.name, &b3.price, &b3.pages);
     //^ See the space here, if there is no space but still a '\n' in the buffer it get's read

答案 1 :(得分:1)

你的问题是,scanf()在扫描字符串方面非常糟糕。特别是,scanf()无法动态分配(通过malloc())一个字符串,并从输入中为其分配适当的子字符串。

您的代码只解析一个字符:%c

显而易见的改进 - 在结构中声明类似char name[40],然后在扫描代码中使用%40c - 也不起作用,因为它不关心字符串结尾。它将始终消耗您输入的40个字符,包括数字等。

scanf()的读取趋势直到它到达,它想要什么,也是为什么你的代码结束为时过早的原因。

因此,通常的解决方案是一次读取一行输入(例如,通过fgets()或相当新的库函数getline()),然后使用您的代码将该行斜入适当的部分。