从空间字符输入读取字符串?

Hie*_*yen 93 c string whitespace input scanf

我正在使用Ubuntu,我也使用Geany和CodeBlock作为我的IDE.我正在尝试做的是读取一个字符串(如"Barack Obama")并将其放在一个变量中:

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    scanf("%s", name);
    printf("Your Name is: %s", name);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Enter your name: Barack Obama
Your Name is: Barack
Run Code Online (Sandbox Code Playgroud)

如何让程序读取整个名称?

pho*_*xis 167

使用:

fgets (name, 100, stdin);
Run Code Online (Sandbox Code Playgroud)

100是缓冲区的最大长度.您应该根据需要进行调整.

使用:

scanf ("%[^\n]%*c", name);
Run Code Online (Sandbox Code Playgroud)

[]是扫描集字符.[^\n]告诉我,虽然输入不是换行符('\n')接受输入.然后使用%*c它从输入缓冲区中读取换行符(未读取),并*指示此读取输入被丢弃(赋值抑制),因为您不需要它,并且缓冲区中的这个换行符不会创建您可能采取的下一个输入的任何问题.

请阅读此处有关scanset赋值抑制运算符的信息.

注意你也可以使用gets....

切勿使用gets().因为在不事先知道数据的情况下不可能分辨出get()将读取多少个字符,并且因为gets()将继续存储超过缓冲区末尾的字符,所以使用它是非常危险的.它已被用来打破计算机安全.请fgets()改用.

  • @phaxis 为什么是 `%*c` ?有什么理由使用“c”而不是任何其他字母?因为我在网上找不到它的参考。另外,我一直在执行 `scanf("%[^\n]\n", name)` 来丢弃换行符并且效果很好。 (2认同)
  • @Djack: `%*c` 只是删除任何字符,比如说它不是 `\n` 。 (2认同)
  • %c表示一个字符就像%d表示一个整数,%*c表示所有字符.所以完全意味着读取所有字符,直到你遇到一个新的字符@NathanProgrammer (2认同)

Sri*_*yer 21

试试这个:

scanf("%[^\n]s",name);
Run Code Online (Sandbox Code Playgroud)

\n 只需设置扫描字符串的分隔符.

  • 此外,`s` 在这里也没有意义。`%[^\n]` 已经要求除换行符之外的所有字符。 (3认同)

Cri*_*usi 7

正确答案是这样的:

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    // pay attention to the space in front of the %
    //that do all the trick
    scanf(" %[^\n]s", name);
    printf("Your Name is: %s", name);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

% 前面的空格非常重要,因为如果您的程序中还有另外几个 scanf,假设您有 1 个整数值的 scanf 和另一个具有双精度值的 scanf...当您到达 char (string) 的 scanf 时name)该命令将被跳过,您无法为其输入值...但是如果您将该空格放在 % 前面,则一切正常,不会跳过任何内容。

  • 另外,“s”在这里没有意义。`%[^\n]` 已经要求输入除换行符之外的所有字符。 (2认同)

kyl*_*e k 6

下面是一个如何使用该fgets函数获取包含空格的输入的示例.

#include <stdio.h>

int main()
{
    char name[100];
    printf("Enter your name: ");
    fgets(name, 100, stdin); 
    printf("Your Name is: %s", name);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


小智 6

scanf(" %[^\t\n]s",&str);
Run Code Online (Sandbox Code Playgroud)

str 是从中获取字符串的变量。

  • 此外,`s` 在这里也没有意义。 (2认同)