Scanf函数在换行符之后停止,并且仅读取输入的一小部分(应忽略换行符和制表符)

时间:2019-03-02 15:20:44

标签: c string char int scanf

整个问题的简短版本:

我要加载此输入

4
     CAAC

      28    EAAEB5
  F489AD95

但是我能从中得到的是:

4                                                                                                                                                                                           

我正在尝试从输入中得出以下参数:4 CAAC 28 EAAEB5 F489AD95

---------------我的代码的详细说明---------------------------

我是C语言的新手,我正在尝试进行输入,以字符串形式输入并在...之后使用它。我在处理"Whitespaces"时遇到问题,例如[{{1} },"\n""\t"]这是我给编译器的输入:

" "

有一堆空格,制表符等。我想做的是读取它,并替换\ n和\ t(在clode波纹管箱中,我试图忽略它,因为在scanf()找到后就\ n跳过其余部分。

这是我现在尝试的代码之一:

4
     CAAC

      28    EAAEB5
  F489AD95

这是我得到的输出:

#include <stdio.h>

int main()
{
    int number;
    char chr[200];

    // %d -> I know that there should be number at the beginning, so until character / space appears, I want to read the number.
    // scanf("%d", &number);

    // ignores \n and \t and then puts it in chr
    scanf(" %[^\t\n]s", &chr);

    // last should be \n so this is just acheck if there is ( its gonna be in if later )
    scanf("%c");

    printf("\n %s", chr);
    printf("\n Heythere");

    return 0;
}

我一直在考虑将其放入循环中,但是问题是,最后一个字符是“ \ n”,并且在给定的字符串中它可能出现多次。

我目前正在尝试为scanf()找到最佳选择,以读取这些行并忽略新行

/////////

换句话说:

我正在尝试从输入中得出以下参数:4 Heythere 4 CAAC 28 EAAEB5

任何想法如何解决它,以便能够完全缓冲它? (也是对我有帮助的最佳答案,它将是一个,它将用一个单一的“”(空格)代替那些“ \ n”和“ \ t”)预先感谢您的回答(如果真的很简单,也深感抱歉。并回答百万次...我被困在这里一周了)

2 个答案:

答案 0 :(得分:3)

您有几种选择:

  • 在IS中使用官方讨论线程
  • 在他们的时间咨询任何顾问
  • 或者,再问他们一次,如果你不能来
  • 写一封电子邮件给任何顾问

My feelings about this post

答案 1 :(得分:1)

表面上,您只需要一个循环即可读取五个字符串:

TimeOut 600

现在,数组的元素将包含您提供的5个字符串(“单词”)。

根据设计,scanf()函数在很大程度上将空格忽略,除非它分隔字符串或数字。除三个转换说明符外,所有转换说明符都跳过前导空格-char data[5][100]; int i; for (i = 0; i < 5; i++) { if (scanf("%99s", data[i]) != 1) { fprintf(stderr, "Unexpected input failure (i = %d)\n", i); exit(EXIT_FAILURE); } } %c(扫描集)和%[…]除外。

%n转换规范会跳过前导空格(空格,制表符,换行符),最多消耗99个非空格字符,并在第一个空格处停止(或当字符串已满时) ,如果字符串不完整,则将输入流中的空白留给下一个输入处理。

很明显,如果您不知道有五个要读取的字符串,则必须加倍努力-但基本思想是相同的。

如果要保留或更改换行符,制表符,空格,则%99s不是该作业的正确工具。它不在乎空白,而您却在乎-不会带来幸福。然后,您使用fgets()或POSIX getline()来读取输入行,然后可以根据需要处理空白,制表符和换行符。