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

标签 c string input

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

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

我尝试使用:

char name[50];
scanf("%49s",name);

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

最佳答案

您可以在输入格式说明符前添加一个(单个)空格,以跳过任何/所有前导空白字符,然后使用 [set] format specifier (前面有“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;
}

测试:

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

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

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

  1. 永远不要使用(或尝试使用)fflush(stdin)
  2. 代码如 the following一种典型的方式是:
int c;
while ( (c = getchar()) != '\n' && c != EOF ) { }

关于c - 从控制台读取正好 50 个字符(49 +1 表示 null),仅忽略所有初始空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71400617/

相关文章:

c - 如何扫描 C 语言中的一个句子

string - 没有相邻重复序列的最长 3 个字符的字符串?

javascript - 如果其他输入没有值,则清除一个输入

python - 将输入(来自标准输入)转换为列表

input - Lua中有 "Get Keyboard Input"函数吗? (方向键)

c - C 中的缓冲区解析

c : How to signal end of input

c# - 可以使用 LINQ 从字符串中提取关键字吗?

python - 一个字符串,对于其中的每个字符,都存在按字母顺序小于它之前的所有字符

c++ - 寻找使用 AgentX 实现 SNMP 表的示例代码