【问题标题】:getchar() and reading line by linegetchar() 并逐行读取
【发布时间】:2011-02-05 19:10:29
【问题描述】:

对于我的一项练习,我们需要逐行阅读并仅使用 getchar 和 printf 进行输出。我正在关注 K&R,其中一个示例显示了使用 getchar 和 putchar。根据我的阅读,getchar() 一次读取一个字符,直到 EOF。我想要做的是一次读取一个字符,直到行尾,但将写入的任何内容存储到 char 变量中。因此,如果输入 Hello, World!,它也会将其全部存储在一个变量中。我尝试使用 strstr 和 strcat 但没有成功。

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

【问题讨论】:

  • 你不能将所有字符存储在一行中,然后读取数组的每个字符,直到你有一个空字符吗?
  • @stanigator:那么您必须处理内存不足时发生的情况。更好的方法是忘记行并一次读取一些中等大小的固定N 字符。

标签: c getchar


【解决方案1】:

您将需要多个字符来存储一行。使用例如一个字符数组,如下所示:

#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 它只是将最后一次读取输入后的 char 设置为 0。在 C 中,字符串以 char 0 终止 - 它们以 nul 终止(值为 0 的字节,而不是字符'0') - 否则它不是字符串 这就是字符串函数如何知道字符串何时结束的方式,例如printf 遇到 0 字符时将停止。 strlen() 将计算字符数,直到第一个 0 字符。
猜你喜欢
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2012-02-16
  • 2010-11-07
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多