getchar() 和逐行读取

3

我正在做一个练习,要求我们使用getchar和printf逐行读取并输出。我正在跟随K&R的示例,其中一个示例使用了getchar和putchar。从我所读的内容来看,getchar()一次读取一个字符,直到EOF。我想做的是一次读取一行,但将写入的任何内容存储在字符变量中。因此,如果输入Hello, World!,它也将全部存储在变量中。我尝试过使用strstr和strcat,但没有成功。

while ((c = getchar()) != EOF)
{   
    printf ("%c", c);
}
return 0;

你不能把所有字符都存储在一行中,然后读取数组的每个字符直到遇到空字符吗? - stanigator
@stanigator:然后你必须处理当内存耗尽时会发生什么。更好的方法是忘记行并一次读取一些适度大小的固定N个字符。 - R.. GitHub STOP HELPING ICE
1个回答

4
你需要多个字符来存储一行文本。可以使用字符数组来实现,例如:
#define MAX_LINE 256
char line[MAX_LINE];
int c, line_length = 0;

//loop until getchar() returns eof
//check that we don't exceed the line array , - 1 to make room
//for the nul terminator
while ((c = getchar()) != EOF && line_length < MAX_LINE - 1) { 

  line[line_length] = c;
  line_length++;
  //the above 2 lines could be combined more idiomatically as:
  // line[line_length++] = c;
} 
 //terminate the array, so it can be used as a string
line[line_length] = 0;
printf("%s\n",line);
return 0;

使用这种方法,您无法读取超过固定大小的行(在此情况下为255)。 K&R稍后将教您动态分配内存的方法,以便您可以读取任意长的行。


你能解释一下 "line[line_length] = 0;" 的作用以及为什么必须终止数组吗? - franchise842
@franchise842 它只是将最后读取的输入后面的字符设置为0。在C中,字符串以char 0终止 - 它们是nul终止的(一个值为0的字节,而不是字符'0') - 否则它就不是一个字符串。这就是字符串函数知道字符串何时结束的方式,例如printf遇到0字符时会停止。strlen()会计算到第一个0字符的字符数。 - nos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接