从控制台读取正好 50 个字符(49 +1 表示 null),仅忽略所有初始空格

MrS*_*ime 2 c string input

我如何从控制台中的用户输入中读取恰好 50 个字符(49,+1 表示空),忽略所有初始空格(如第一个单词之前),但保留其后的 49 个字符,包括所有空格?

另外,如果用户输入少于 49 个字符并输入换行符,它只会处理该内容(换行符之前的所有内容都会忽略初始空格)。

我尝试使用:

char name[50];
scanf("%49s",name);
Run Code Online (Sandbox Code Playgroud)

然而,这似乎忽略了所有空白;所以,如果我的名字是这样的:“Mark Smith”,它将无法正确处理。

Adr*_*ica 5

您可以在输入格式说明符之前添加一个(单个)空格,以跳过任何/所有前导空白字符,然后使用[set]格式说明符(前面带有“49”限制)输入与给定“集”匹配的所有后续字符。在您的情况下,该集合可以是换行符之外的任何内容,因此在集合之前使用“not”前缀 ( ) ,并使集合^包含换行符 ( ):\n

#include <stdio.h>

int main()
{
    char name[50];
    printf("Enter input: ");
    int n = scanf(" %49[^\n]", name);
    if (n != 1) {
        printf("Input error!");
    }
    else {
        printf("Input was: %s\n", name);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试:

Enter input:        I am the egg-man; I am the egg-man; I am the walrus!
Input was: I am the egg-man; I am the egg-man; I am the walr
Run Code Online (Sandbox Code Playgroud)

请注意,使用上面的代码,如果输入的输入字符串超过 49 个字符,则多余的字符将留在输入缓冲区中。这些很可能会导致进一步的问题,因为它们将被视为任何后续调用scanf(或类似输入函数)的输入。

有几种方法可以“清除”输入缓冲区:How toclear input buffer in C? 简要总结链接问题的答案:

  1. 切勿使用(或尝试使用)fflush(stdin)
  2. 类似下面的代码是一种典型的方式:
int c;
while ( (c = getchar()) != '\n' && c != EOF ) { }
Run Code Online (Sandbox Code Playgroud)