如何在C语言中输入空格

如何在C语言中输入空格,c,whitespace,scanf,C,Whitespace,Scanf,我想从控制台获取字符数组,它还包括空格,我在C中知道的唯一方法是scanf,但一旦它使用空格,它就无法停止获取输入。我该怎么办 这就是我正在做的 char address[100]; scanf("%s", address); 尝试使用fgets()。它将从您选择的流中读取完整的行(我猜您正在寻找stdin)。您的案例示例如下: char address[100]; fgets(address, 100, stdin); fgets()最多读取在第二个参数中传递的字符数(减1)。没有缓冲

我想从控制台获取字符数组,它还包括空格,我在C中知道的唯一方法是scanf,但一旦它使用空格,它就无法停止获取输入。我该怎么办

这就是我正在做的

char address[100];

scanf("%s", address);
尝试使用fgets()。它将从您选择的流中读取完整的行(我猜您正在寻找stdin)。您的案例示例如下:

char address[100];

fgets(address, 100, stdin);
fgets()最多读取在第二个参数中传递的字符数(减1)。没有缓冲区溢出,您将得到整行,最多包含一个换行符(或最多EOF)。请注意,由于要读取的最大字符数是参数之一,因此可能会得到部分行。检查返回字符串中的最后一个字符是否为“\n”,这样您就知道得到了完整的一行。EOF检测也非常简单;
NULL
返回值和对
errno
的检查应该可以帮助您解决问题

感谢Chris(以下),关于部分线条的观点

fgets()
从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果新行被读取,它将被存储到缓冲区中。“\0”存储在缓冲区中最后一个字符之后

例如,许多SO问题中提供了更多详细信息


(由于流行的需求,删除了对
get()
的引用)

您可以尝试以下方法:

char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);
有,但依我拙见,它们很快就会变得丑陋。常见的模式(令人惊讶的是还没有提到)是使用读取字符串,然后使用来处理它
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.
  }

我个人会使用FGET,但这里已经指出了这一点。使用scanf的一种方法是

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

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

如果您想在struct中使用动态数组获取输入直到新行,这可能很有用:

#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);
}
#包括
#包括
结构学生{
字符*名称;
};
int main()
{
结构学生;
s、 name=malloc(sizeof(char*));
printf(“名称:”);
//fgets(s.name,10,stdin);//这会将您的输入限制为10个字符。
scanf(“%[^\n]”,s.name);
printf(“您输入的:\n\n”);
printf(“%s\n”,s.name);
}
我的风格

 #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);
#包括
#定义Charisimuzulugu 30
结构个人动画
{       
char adSoyad[Charisimuzulugu];
}个人;
printf(“您的字符:”);
scanf(“%[^\n]”,personel.adSoyad);
printf(“\n\n%s”,personel.adSoyad);

FGET看起来有3个参数,1个。宪章指针。2.int 3。File*我应该在第二个和第三个参数中输入什么?+1但请注意,该行可能超过字符限制,因此您应该始终检查您读取的行是否以
'\n'
字符结尾。谢谢,但我在使用它时遇到了一点小麻烦,基本上我是在这之前输入字符,即scanf(“%s”,name);然后把你的电话号码(地址,100,标准电话号码);它接受第一个输入,即名称和程序结束,所以它不会进入第二行。但如果我只是问地址,它是有效的。如何确保第二条线路(fgets)(地址100,stdin)正常工作;我想我不理解你的评论;为什么节目要结束?你能给我们看更多的代码吗?当我们讨论这个主题时(这是相关的),由于
scanf()
处理空白的方式很奇怪,建议不要在同一个文件句柄上混合调用
fscanf()
和调用
fgets()
(或其他读取实用程序)。最常见的推荐模式是使用
fgets()
将代码读入字符串,然后在该字符串上使用
sscanf()
。这样,我们就拥有了两个世界中最好的,而且我们也安全地拥有了它们。从您链接的页面上可以看到:“永远不要使用gets()。因为如果事先不知道数据,就无法判断gets()将读取多少个字符,因为gets()将继续存储超过缓冲区结尾的字符,使用它是极其危险的。它曾被用来破坏计算机安全。请改用fgets()。“很高兴知道
get()
存在,但它永远不应该被使用(在code golf之外),而且OP似乎有点新,所以我郑重建议不要提及它的存在。gets()引用被撤回。这是正确的,但不知道我这样做时它为什么不工作。字符名[20];字符地址[100];scanf(“%s”、&name);fgets(地址,100,标准DIN);
 #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);