【问题标题】:scanf function not working with charactersscanf 函数不适用于字符
【发布时间】:2017-02-21 15:40:05
【问题描述】:

我只是在用 C 语言尝试一个简单的程序,插入一个数组。 我使用了scanf 函数来接受字符,但编译器似乎只是跳过了它,然后就进入了程序的末尾。 这是我使用的代码:-

#include <stdio.h>

void main()
{
    int a[50], i, j, m, n, x;
    char ch;
    printf("Enter the no. elements of the array :- ");
    scanf("%d", &m);
    printf("Enter the elements below :- ");
    for (i = 0; i < m; i++)
    {
        scanf("%d", &a[i]);
    }
    printf("The array is :- \n");
    for (i = 0; i < m; i++)
    {
        printf("%d", a[i]);
    }
    printf("\nDo you want to enter an element ? (Y/N)\n");
    scanf("%c", &ch);       // The compiler just skips this along with the      
    while (ch == 'y' || ch == 'Y') // while loop and goes straight to the printf 
    {                   // statement
        printf("The index of the element :- ");
        scanf("%d", &n);
        printf("\nEnter a number :- ");
        scanf("%d", &x);
        for (i = m; i > n; i--)
        {
            a[i] = a[i - 1];
        }
        a[n] = x;
        printf("\nInsert more numbers ? (Y/N)");
        scanf("%c", &ch);
        m = m + 1;
    }
    printf("\nThe array is :- ");
    for (i = 0; i < m; i++)
    {
        printf("%d", a[i]);
    }
}

我使用变量ch 是为了让用户可以选择是否插入元素,即YN

但编译器基本上跳过了第三个scanf 函数,即接受char 的函数以及while 循环。

我只想知道为什么scanf 函数被跳过了?

【问题讨论】:

  • 请将scanf("%c",&amp;ch); 更改为scanf(" %c",&amp;ch); 以便使用缓冲区中剩余的换行符。与其他格式不同,%c 不会自动跳过输入缓冲区中的空白。
  • ....请发布缩进良好的代码...
  • 编译器不关心你按下的键。它仅从您的源代码生成可执行程序。这个可执行程序(以及您编译生成它的源代码)负责正确处理输入。读取数字的代码不会消耗按 &lt;Enter&gt; 时产生的换行符,然后下一个 scanf("%c") 会读取换行符,这就是代码无法按预期工作的原因。

标签: c arrays scanf


【解决方案1】:

回到前面的scanf,它是最后一个数组成员。

scanf("%d",&a[i])

如果你在输入文件中输入:

32\n 
^^

输入将在读取十进制数后在换行符之前等待。

在导致问题的scanf 中:

scanf("%c", &ch); 

它将读取换行符,因为它在 input可用,这就是为什么它会在隐式执行后跳过该行。

如@xing 和@WeatherVane 的评论所述,您只需在说明符%c 之前添加空格即可忽略空格。

scanf(" %c",&ch);

C99 7.19.6.2

输入空白字符(由 isspace 函数指定) 被跳过除非规范包含 [、c 或 n 说明符.250)

【讨论】:

  • 好答案+1。但考虑使用大量以前的答案作为重复
  • 这个问题也是重复的,但似乎OP对scanf没有很好的理解
  • “它将读取换行符,因为它在输入中可用,这就是它会跳过它的原因。忽略空格”我不太明白。您能否详细说明为什么 scanf 函数会跳过,因为它前面有一个 \n。
  • scanfstdin 的输入文件中读取。只要它在文件中找到所需的字符和正确的格式,它就会直接读取这些字符,而无需您干预。当输入文件为 empty 时,它将等待用户用所需的字符填充输入文件。在您的情况下,在读取十进制数字后,您输入的换行符将保留在输入文件中,因此对于下一个 scanf,您需要一个字符,并且由于换行符是一个字符,它将从输入中读取它,这就是它会被跳过的原因。跨度>
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多