更改scanf()分隔符

fir*_*ast 3 c scanf delimiter

我的目标是将分隔符更改scanf为" \n".我尝试使用scanf("%[^\n]s",sen);并且对单个输入工作正常.但是当我把同一行放在一个for多个句子的循环中时,它给了我垃圾值.

有谁知道为什么?


这是我的代码:

char sen[20];
for (i=0;i<2;i++)
{
    scanf("%[^\n]s",sen);
    printf("%s\n",sen);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 12

考虑这个(C99)代码:

#include <stdio.h>

int main(void)
{
    char buffer[256];

    while (scanf("%255[^\n]", buffer) == 1)
        printf("Found <<%s>>\n", buffer);
    int c;
    if ((c = getchar()) != EOF)
        printf("Failed on character %d (%c)\n", c, c);
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

当我运行它并输入一个字符串'绝对任何空格TABTAB标签丰富!'时,它给了我:

Found <<absolutely anything with   spaces       tabs galore!>>
Failed on character 10 (
)
Run Code Online (Sandbox Code Playgroud)

当然,ASCII(UTF-8)10 10是换行符.

这有助于您了解您的问题吗?


它适用于这种情况(对于单行)但如果我想将多行输入放入数组数组中则会失败.我不知道如何scanf在代码中返回一个值?

有许多(大多数?)有经验的C程序员避免scanf()fscanf()喜欢瘟疫的原因; 他们太难以正常工作了.我建议这个选择,使用sscanf(),不得到同样的咒骂那scanf()fscanf()做.

#include <stdio.h>

int main(void)
{
    char line[256];
    char sen[256];

    while (fgets(line, sizeof(line), stdin) != 0)
    {
        if (sscanf(line, "%255[^\n]", sen) != 1)
            break;
        printf("Found <<%s>>\n", sen);
    }
    int c;
    if ((c = getchar()) != EOF)
        printf("Failed on character %d (%c)\n", c, c);
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

这将读取输入行(使用fgets()它确保没有缓冲区溢出(假装该gets()函数,如果您听说过它,将您的计算机熔化为金属和硅池),然后用于sscanf()处理该行.这将处理新行,这是原始代码的垮台.

char sen[20];
for (i=0;i<2;i++)
{
    scanf("%[^\n]s",sen);
    printf("%s\n",sen);
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 你不检查是否scanf()成功.
  2. 您在第一次迭代时将换行符保留在缓冲区中; 第二次迭代生成返回值0,因为要读取的第一个字符是换行符,即扫描集排除的字符.
  3. 你看到的胡言乱语可能是重复的第一线投入.实际上,如果它不是有界循环,它就不会等你再打字了; 它会一遍又一遍地吐出第一行.

从中返回值 scanf()

的定义scanf()是:(从1999年的ISO/IEC 9899):

§7.19.6.4scanf函数

概要

 #include <stdio.h>
 int scanf(const char * restrict format, ...);
Run Code Online (Sandbox Code Playgroud)

描述

2该scanf函数等同于fscanf参数stdin之前插入的参数scanf.

返回

3 scanf如果在任何转换之前发生输入故障,该函数将返回宏EOF的值.否则,该scanf函数返回分配的输入项的数量,如果早期匹配失败,则可以少于提供的数量,甚至为零.

请注意,当我的第一个程序中的循环退出时,它是因为scanf()返回0而不是EOF.