【问题标题】:taking string and integer in structure variable在结构变量中取字符串和整数
【发布时间】:2015-10-21 13:44:22
【问题描述】:
#include <stdio.h>
struct book
{
  char name[1000];
  int price;
};

int main()

{

    struct book ct1[5];
    int i;

    for (i = 0; i < 5; i++)
   {
    printf("Please Enter %d Number Book Name: ",i+1);
    gets(ct1[i].name);
    printf("Price: ");
    scanf("%d", &ct1[i].price);
  }

for (i = 0; i < 5; i++)
{
    printf("%d Nuumber Book's name and price : \n",i+1);
    printf("%s = %d\n", ct1[i].name, ct1[i].price);
}


return 0;

}

我编写这段代码是为了获取书名和价格并打印出来。

喜欢

输入: 请输入 1 个号码簿名称:Sherlock

价格:100

.......

.......

输出:

号码簿的名称和价格: 夏洛克 = 100

..................

.......

但它接受这样的输入 请输入 1 个号码簿名称:sherlock holmes

价格:100

请输入 2 号码簿名称:价格:........

第一次是正确的,但从第二次开始出现问题。请帮帮我。

【问题讨论】:

  • 究竟“出了什么问题”?不要使用gets,而是使用fgets
  • scanf("%d" --> scanf("%d%*c"
  • 它停止使用字符串

标签: c


【解决方案1】:

首先停止使用gets,改用fgets -

fgets(ct1[i].name,sizeof ct1[i].name,stdin );

在您的scanf 之后,您可以执行此操作 -

while((c=getchar())!=EOF && c!='\n');       

for循环之前将c声明为int

这是从stdin 中删除'\n',它在每次迭代中保留在scanf 之后并导致fgets 返回。

【讨论】:

  • 完美运行。你能解释一下这个while循环是如何工作的吗?
  • @TawhidurRahmanTanim 从getchar 返回的值分配给c。如果返回并存储在c 中的值是EOF'\n',则循环退出,如果不是,则循环提取,直到遇到EOF'\n'。这样,如果'\n' 存在于stdin 中,则会从中读取。
【解决方案2】:

scanf 之后包含此行以删除stdin 中剩余的换行符

fflush(stdin)

【讨论】:

  • 从来不知道。非常感谢@chux
猜你喜欢
  • 1970-01-01
  • 2017-06-25
  • 2011-04-21
  • 1970-01-01
  • 2015-10-20
  • 2019-12-15
  • 2021-08-29
  • 2013-12-30
  • 1970-01-01
相关资源
最近更新 更多