如何在C语言中输入空格

8

我想从控制台获取包含空格的字符数组,我只知道在C语言中可以使用scanf方法,但是它会忽略空格并继续读取输入。该怎么办?

以下是我的代码:

char address[100];

scanf("%s", address);
7个回答

14

尝试使用fgets()。它可以从您选择的流中读取完整的一行(我猜您是在寻找stdin)。以下是一个适用于您情况的示例:

char address[100];

fgets(address, 100, stdin);

fgets()函数将最多读取第二个参数传递的字符数(减1)。没有缓冲区溢出,你将得到整行字符串直至包括换行符(或直至EOF)。请注意,由于要读取的最大字符数是其中一个参数,因此有可能只获取到部分行。检查返回字符串中的最后一个字符是否为 '\n',就可以知道是否获取了完整的行。 EOF检测也非常简单; 一个NULL返回值和对 errno 的检查应该会帮助你。

感谢 Chris (下面) 关于部分行的指点。


1
+1 但请注意,该行可能超过字符限制,因此您应始终检查您读取的行是否以 '\n' 字符结尾。 - Chris Lutz
好的,这是代码。char name[20]; char address[100]; scanf("%s", &name); fgets(address, 100, stdin); - itsaboutcode
2
既然我们正在谈论这个主题(而且这是相关的),由于scanf()处理空格的奇怪方式,建议不要在同一个文件句柄上混合调用fscanf()fgets()(或其他读取工具)。最常推荐的模式是使用fgets()将代码读入字符串,然后在该字符串上使用sscanf()。这样,我们就可以安全地拥有两者的优点。 - Chris Lutz
哦,这是因为您的scanf()没有读取输入名称后的换行符。因此,scanf()返回,并且fgets()立即读取一个换行符。对于两个调用,请使用fgets(),我认为您会解决问题的。 - Carl Norum
我刚刚进行了一点小修改,我在scanf后面加入了getch(),然后使用了fgets。现在它可以正常工作了。 - itsaboutcode
显示剩余8条评论

7
你可以尝试像这样做:

您可以尝试类似以下的操作:

char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);

这是正确的,但不知道为什么当我这样做时它不起作用。char name[20]; char address[100]; scanf("%s", &name); fgets(address, 100, stdin); - itsaboutcode

1

使用scanf()的方法, 但在我看来,它们很快就会变得丑陋。常见的模式(令人惊讶的是还没有被提到)是使用fgets()读取字符串,然后使用sscanf()进行处理。sscanf()的工作方式类似于scanf(),只不过它处理的是你传递给它的字符串(与printf()sprintf()的关系相同)。基础知识:

char s[100], str[100];
int i, x;
fgets(s, 100, stdin);
if(sscanf(s, "%d %x %s", &i, &x, str) != 3)
  {
    // our three variables weren't all set - probably an invalid string
    // either handle the error or set default values here.
  }

0

查看fgets()

fgets()从流中读取最多少于size个字符,并将它们存储到指向s的缓冲区中。在EOF或换行符之后停止读取。如果读取到换行符,则将其存储到缓冲区中。在缓冲区中的最后一个字符后面存储'\0'。

char *fgets(char *s, int size, FILE *stream);

更多细节可以在许多SO问题中找到,例如通过scanf输入字符串

(由于广大用户的要求,已删除对gets()的引用)


2
从您链接的页面中:永远不要使用gets()。因为在不知道数据的情况下,无法确定gets()将读取多少个字符,并且因为gets()将继续存储超出缓冲区末尾的字符,所以使用它非常危险。它已被用于破坏计算机安全。请改用fgets()。 - Fred Larson
知道gets()的存在是很好的,但它永远不应该被使用(除了代码高尔夫之外),而且OP似乎有点新手,所以我强烈建议不要提到它的存在。 - Chris Lutz
同意。gets() 函数已被撤回。 - gimel

0
如果你想使用结构体内的动态数组来一直输入直到新行,这可能会有用:
#include<stdio.h>
#include<stdlib.h>

struct student{
char *name;
};

int main()
{
        struct student s;

        s.name = malloc(sizeof(char *));

        printf("Name: ");
        // fgets(s.name, 10, stdin); // this would limit your input to 10 characters.

        scanf("%[^\n]", s.name);   

        printf("You Entered: \n\n");

        printf("%s\n", s.name);
}

0

我的风格。

 #include <stdio.h>

    #define charIsimUzunlugu 30

        struct personelTanim
        {       
            char adSoyad[charIsimUzunlugu];             
        } personel;

    printf(" your char       : ");
    scanf("%[^\n]",personel.adSoyad);

    printf("\n\n%s",personel.adSoyad);

0

个人而言,我会使用fgets,但这已经在此处指出。使用scanf的一种方法是

scanf("%[^\n]", address);

这将接收所有字符,直到找到“\n”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接