【问题标题】:Why is the scanf() getting skipped? [duplicate]为什么 scanf() 被跳过? [复制]
【发布时间】:2021-03-19 13:24:30
【问题描述】:

在执行下面的代码时,输​​出结果是

输入活动选择:你好

在输入活动数量并输入活动后。 scanf() 将被完全跳过。

我尝试了在互联网上找到的所有内容,例如使用getchar() 而不是scanf(),在输入之前放置getchar() 并使用fflush()

但似乎没有任何效果。谁能告诉我我犯了什么错误?

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    char name;
    int start;
    int finish;
}activity;

int main()
{
    int n;
    printf("Enter number of activities: ");
    scanf("%d",&n);
    
    activity* a = (activity*)malloc(sizeof(activity)*n);
    printf("Enter activities: ");
    
    for(int i=0;i<n;i++)
    {
        scanf("%c %d %d ",&(a[i].name),&(a[i].start),&(a[i].finish));
    }
    
    //getchar();
    char ch;
    int s,f;
    printf("Enter activity selected:");
    //fflush(stdin);
    //scanf(" %c",&ch);
    ch = getchar();
    printf("hello");
    return 0;
}

【问题讨论】:

  • %c 之前没有空格,所以它读取前一个scanf 留下的换行符。
  • 你为什么要评论scanf(" %c",&amp;ch);,那会等你输入,ch = getchar();你必须手动完成
  • //scanf(" %c",&amp;ch);这里%c前面有个空格。
  • 我指的是循环中的scanf("%c。顺便说一句,您应该检查来自scanf 的返回值以确保它有效。
  • @IrAM 我刚刚测试了ch = getchar(),在scanf(" %c",&amp;ch); 不起作用之后。

标签: c scanf


【解决方案1】:

删除scanf("%c %d %d ",&amp;(a[i].name),&amp;(a[i].start),&amp;(a[i].finish));中这些不必要的空格并记得释放分配的内存。

我只是在需要的地方修改了您的代码,但不明白您阅读最后一个字符的目的,因为您没有重复任何菜单或其他内容。

不管怎样,下面这个版本工作得很好。

#include<stdio.h>
#include<stdlib.h>

 typedef struct
 {
     char name;
     int start;
     int finish;
 }activity;

 int main()
 {
    int n;
    char ch;
    int s,f;

    printf("Enter number of activities: ");
    scanf("%d",&n);
    
    activity* a = (activity*)malloc(sizeof(activity)*n);
    
    for(int i = 0; i < n; i++)
    {
        printf("enter activity details for %d:", i+1);
        scanf(" %c%d%d",&(a[i].name),&(a[i].start),&(a[i].finish));
    }
    
    free(a);
    a = NULL;
    
    printf("Enter activity selected:");
    scanf(" %c",&ch);

    printf("hello");
    return 0;
}

输出:

Enter number of activities: 3                                                                                           
enter activity details for 1:A 1 2                                                                                      
enter activity details for 2:B 3 4                                                                                      
enter activity details for 3:C 5 6                                                                                      
Enter activity selected:E                                                                                               
hello 

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2015-05-06
    • 2017-08-12
    • 2013-01-07
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多