【问题标题】:Can't read all of the strings无法读取所有字符串
【发布时间】:2015-01-11 11:54:05
【问题描述】:
int main()
{
int epilogi,n=1,x,i;
char temp[2];
list=malloc(n*sizeof(struct address));
printf("Lista taxidromikon dieuthinseon\n");
printf("1. Eisagogi stoixeion\n");
printf("2. Diagrafi stoixeion\n");
printf("3. Emfanisi listas\n");
printf("4. Eksodos\n\n");
printf("Epilekste dinontas dinontas ena arithmo apo to 1 eos to 4\n");
while (scanf("%d", &epilogi)!=4)
{
if (epilogi==1)
{
while (strcmp("n",temp))
{
printf("Dose onomateponimo, dieuthinsi, poli, xora kai taxidromiko kodika\n");
fgets(list[n-1].name,80,stdin);
fgets(list[n-1].addr,50,stdin);
fgets(list[n-1].city,50,stdin);
fgets(list[n-1].country,30,stdin);
scanf("%[^\n]%d", &list[n-1].code);
printf("------------------------------------\n");
printf("Thelete na eisagete allo stoixeio?(Pliktrologiste y gia nai n gia oxi)\n");
fgets(temp,2,stdin);
printf("\n");
if (strcmp("n",temp))
{
n=n+1;
list=realloc(list,n*sizeof(struct address));
}
} 

[编辑] 好的,所以我解决了 90% 的问题。现在程序成功要求我输入所有 6 但不是临时字符串。那是因为最后一个 scanf 创建的缓冲区中有一个换行符。我怎样才能让 fgets 忽略它?

【问题讨论】:

  • fgets 应该可以工作。显示你做了什么...
  • 请多显示几行代码
  • @ohyez96 temp 第一次做什么?
  • 在这个程序中,我选择选项 1 来输入某人的信息(姓名、地址、城市、国家)。 temp 字符串用于询问用户是否要添加另一个
  • 好的,我解决了主要问题。由于您所说的,它会正确扫描我的所有字符串,除了 temp。关键是我可以放一个 %[^\n] 并处理 scanf 的问题,但是我该如何处理 scanf 存储在缓冲区中的换行符?我将编辑帖子,以便每个人都可以看到新程序

标签: c string scanf fgets


【解决方案1】:

您是否使用-Wall 选项进行编译? 线

scanf("%d", list[n-1].code);

如果list 是指向struct address 的指针,则应该产生警告,因为您应该传递code 的地址。试试

scanf("%d", &list[n-1].code);

,它对我有用。按照建议保留fgets 作为字符串。

【讨论】:

  • 试过了。还是不行。它跳过扫描 list[n-1].code ,现在它跳过扫描和临时字符串。 edit 不,我没有使用 -wall 进行编译
  • 您是否用换行符分隔输入到fgets?它扫描直到到达行尾(或读取最大大小)。
  • 当然我每次输入的时候都按回车
  • @ohyez96 没有“尝试”这个错误。这是一个彻底的错误,它必须修复。
  • @WhozCraig 所以这意味着它与编译器有关?
【解决方案2】:

不要将scanf()fgets() 混用。

建议放弃scanf() 电话。
要读取号码,请致电 fgets()aoti()strtol()
这可以在另一个函数中完成。

  int ohyez96_GetInt(int *dest) {
    char buf[50];
    if (fgets(buf, sizeof buf, stdin) == NULL) return EOF;
    // various error checking omitted for now.
    *dest = atoti(buf);
    return 1;
  }

  // while (scanf("%d", &epilogi)!=4)
  while (ohyez96_GetInt(&epilogi) == 1)
  ...
  // scanf("%[^\n]%d", &list[n-1].code);
  if (ohyez96_GetInt(&list[n-1].code) != 1) return -1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多