8

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

这就是我正在做的事情。

char address[100];

scanf("%s", address);
4

7 回答 7

14

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

char address[100];

fgets(address, 100, stdin);

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

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

于 2009-10-12T17:02:30.040 回答
7

你可以尝试这样的事情:

char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);
于 2009-10-12T17:06:53.493 回答
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.
  }
于 2009-10-12T17:30:13.680 回答
0

fgets()

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

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

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

(因大众需求,gets()已删除参考)

于 2009-10-12T17:06:23.183 回答
0

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

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

这需要所有字符,直到找到 '\n'。

于 2009-10-12T18:25:23.960 回答
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);
}
于 2013-06-28T03:16:08.627 回答
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);
于 2014-02-18T11:29:43.433 回答