我是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 ) ;
}
答案 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()),然后使用您的代码将该行斜入适当的部分。