【问题标题】:scanf " %c" does not read whitespace in Cscanf "%c" 不读取 C 中的空格
【发布时间】:2014-03-21 08:27:45
【问题描述】:

我需要读取包括空格在内的用户输入字符并将它们存储在链表中。如果我使用 scanf("%c", &charas) 它会循环运行 2 次,并且只允许输入 1 次。如果我使用 scanf(" %c", &charas) 它不会读取空格。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
struct sarasas {
    char zenklas;
    struct sarasas *kitas;
};
typedef struct sarasas Sarasas;
typedef Sarasas *SarasasPtr;

int tarpas(struct sarasas* sar, int index)
{
    struct sarasas* dabartinis = sar;
    int i;
    for (i=1; i<=index; i++)
    {
        if (dabartinis->zenklas == 32)
            return(i);
        dabartinis=dabartinis->kitas;
    }
}

int main()
{
    int i, n, tarpo_vieta;
    char charas;
    SarasasPtr sar;
    sar=(SarasasPtr) malloc(sizeof(Sarasas));
    SarasasPtr pradzia=sar;
    printf("Iveskite skaiciu n\n");
    scanf("%d", &n);
    printf("Veskite elementus: \n");
    for(i=1;i<=n;i++)
    {
        printf("%d\n", i);
        scanf("%c\n", &charas);
            sar->zenklas=charas;
            sar->kitas=(SarasasPtr) malloc(sizeof(Sarasas));
            sar=sar->kitas;

    }
    sar->kitas=NULL;
    //tarpo_vieta=tarpas(pradzia, n);
    printf("%d\n", tarpo_vieta);
    for (i=1;i<=n;i++)
    {
        printf("%c\n", pradzia->zenklas);
        pradzia=pradzia->kitas;
    }
}

我也不能使用数组。

【问题讨论】:

  • 当您使用 scanf 系列的函数时,请始终检查返回值以防止出现奇怪的行为。我不确定这是否会解决,但我会先尝试。

标签: c char scanf


【解决方案1】:

使用fgets

fgets(comment, sizeof comment, stdin);

或者

使用

scanf("%[^\n]",word);

【讨论】:

  • 这两种方法我都试过了,循环只是通过,它不允许我输入任何东西。
【解决方案2】:

使用这个,有时我们的scanf和gets将无法正常工作,这些发生在使用不同的读取函数读取值时,

scanf("%[^\n]s",word);

此 scanf 将读取您的值直到新行意味着直到您不会键入输入这将读取您的输入(字符串的大小是一个限制)。

scanf("%[^*]",word);

如果您按下,这将读取到您的 '*' 字符。

【讨论】:

    【解决方案3】:

    尝试使用getchar() 代替scanf() 读取一个字符:

     charas = getchar();
    

    【讨论】:

      【解决方案4】:

      首先尝试运行这个:

      char c;
      do {
          c = getchar();
          putchar(c);
      } while (c != '.');
      

      虽然代码显然在每个循环中处理单个字符,但程序实际执行的操作是从用户那里获取任意长度的输入,然后逐个字符地打印,直到遇到句点。

      您可以使用类似的循环,只是在我的代码中代替putchar,编写代码以将c添加到链表中。

      【讨论】:

        【解决方案5】:

        问题出在scanf("%d", &amp;n); 上,虽然它确实在int n 中读取,但它在stdin 中留下了'\n'Enter。这是与下一个scanf("%c\n", &amp;charas); 一起扫描的。

        还有一个问题:scanf("%c\n", &amp;charas); 直到 char 才返回,可选的空白(如 \n,所有这些都被消耗)非空白是进入。 (不过,非空白会返回到 stdin

        正如@miushock 所说,检查 scanf() 系列结果。

        而不是:

        scanf("%d", &n);
        for(i=1;i<=n;i++) {
          scanf("%c\n", &charas);
          sar->zenklas=charas;
        }
        

        char buf[40];
        if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOForIOError();
        if (sscanf(buf, "%d", &n) != 1) Handle_InputError();
        for (i=1; i<=n; i++) {
          if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOForIOError();
          if (strlen(buf) != 2) Handle_InputError();
          sar->zenklas = buf[0];
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-13
          • 1970-01-01
          • 1970-01-01
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多