如何在C中输入空格

我想从控制台获取字符数组,它还包括空格,我在C中知道的唯一方法是scanf,但是一旦用白色空格命中它就会错过停止输入。 我该做什么?

这就是我在做的事情。

char address[100]; scanf("%s", address); 

尝试使用fgets()。 它将从您选择的流中读取一个完整的行(stdin,我想您正在寻找)。 您案例的一个例子:

 char address[100]; fgets(address, 100, stdin); 

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

感谢克里斯(下图),关于部分线的观点。

你可以尝试这样的事情:

 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()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。 阅读在EOF或换行后停止。 如果读取换行符,则将其存储到缓冲区中。 在缓冲区中的最后一个字符之后存储’\ 0’。

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

许多SO问题中提供了更多详细信息,例如input-string-through-scanf 。

(由于受欢迎的需求,对gets()引用被删除了)

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

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

这将占用所有字符,直到找到’\ n’。

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

 #include #include 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  #define charIsimUzunlugu 30 struct personelTanim { char adSoyad[charIsimUzunlugu]; } personel; printf(" your char : "); scanf("%[^\n]",personel.adSoyad); printf("\n\n%s",personel.adSoyad);