我想从控制台获取包含空格的字符数组,我只知道在C语言中可以使用scanf方法,但是它会忽略空格并继续读取输入。该怎么办?
以下是我的代码:
char address[100];
scanf("%s", address);
我想从控制台获取包含空格的字符数组,我只知道在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 (下面) 关于部分行的指点。
您可以尝试类似以下的操作:
char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);
有使用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.
}
查看fgets()
fgets()
从流中读取最多少于size个字符,并将它们存储到指向s的缓冲区中。在EOF或换行符之后停止读取。如果读取到换行符,则将其存储到缓冲区中。在缓冲区中的最后一个字符后面存储'\0'。
char *fgets(char *s, int size, FILE *stream);
更多细节可以在许多SO问题中找到,例如通过scanf输入字符串。
(由于广大用户的要求,已删除对gets()
的引用)
gets()
的存在是很好的,但它永远不应该被使用(除了代码高尔夫之外),而且OP似乎有点新手,所以我强烈建议不要提到它的存在。 - Chris Lutz#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);
}
我的风格。
#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);
个人而言,我会使用fgets,但这已经在此处指出。使用scanf的一种方法是
scanf("%[^\n]", address);
这将接收所有字符,直到找到“\n”。
'\n'
字符结尾。 - Chris Lutzscanf()
处理空格的奇怪方式,建议不要在同一个文件句柄上混合调用fscanf()
和fgets()
(或其他读取工具)。最常推荐的模式是使用fgets()
将代码读入字符串,然后在该字符串上使用sscanf()
。这样,我们就可以安全地拥有两者的优点。 - Chris Lutz