0

我一直在尝试使用 scanf 从 stdin 获取输入,但是在看到空格或返回后它会截断字符串。

我想要的是一种读取存储在缓冲区换行符和空格中的键盘输入的方法。并在按下 ctrl-D 时结束。

我应该尝试使用 fgets 吗?我认为这也不是最佳选择,因为 fgets 在读取 \n 后返回

4

4 回答 4

1

scanf() 在空白边界处拆分输入,因此它不适合您的情况。确实 fgets() 是更好的选择。您需要做的是在 fgets() 返回后继续阅读;每次调用都会读取一行输入。您可以继续阅读直到 fgets() 返回NULL,这意味着无法阅读更多内容。

如果您更喜欢逐个字符地获取输入,也可以使用 fgetc() 代替。EOF当无法读取更多内容时,它将返回。

于 2013-08-31T18:29:44.430 回答
1

没有现成的功能可以从标准输入读取所有内容,但幸运的是,创建自己的功能很容易。未经测试的代码片段,在注释中有一些解释,可以从标准输入读取任意大量的字符:

size_t size = 0; // how many chars have actually been read
size_t reserved = 10; // how much space is allocated
char *buf = malloc(reserved);
int ch;

if (buf == NULL) exit(1); // out of memory

// read one char at a time from stdin, until EOF.
// let stdio to handle input buffering
while ( (ch = getchar()) != EOF) {

    buf[size] = (char)ch;
    ++size;

    // make buffer larger if needed, must have room for '\0' below!
    // size is always doubled, 
    // so reallocation is going to happen limited number of times
    if (size == reserved) {
        reserved *= 2;
        buf = realloc(buf, reserved);
        if (buf == NULL) exit(1); // out of memory
    }
}

// add terminating NUL character to end the string,
// maybe useless with binary data but won't hurt there either
buf[size] = 0;

// now buf contains size chars, everything from stdin until eof,
// optionally shrink the allocation to contain just input and '\0'
buf = realloc(buf, size+1);
于 2013-08-31T18:44:41.817 回答
0

像这样读

char ch,line[20];  
int i=0;  //define a counter

 //read a character assign it to ch,  
 //check whether the character is End of file or not and   
 //also check counter value to avoid overflow.

while((ch=getchar())!=EOF && i < 19 )   
{
   line[i]=ch;
   i++;
}
line[i]='\0';
于 2013-08-31T18:30:23.863 回答
0

如果您想读取所有输入,无论是否为空格,请尝试fread

于 2013-08-31T18:31:10.513 回答