《The C Programming Language》第一章1.9节字符数组示例程序的一个小疑点
《The C Programming Language》第一章1.9节字符数组示例程序的一个小问题
#include<stdio.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/*打印输入最长的行*/
main()
{
int len;/*当前行长度*/
int max;/*目前发现的最长行的长度*/
char line[MAXLINE];/*当前的输入行*/
char longest[MAXLINE];/*用于保存最长的行*/
max = 0;
while((len = getline(line,MAXLINE)) > 0)
if(len > max)
{
max = len;
copy(longest, line);
}
if(max > 0) /*存在这样的行*/
printf("%s", longest);
return 0;
}
/*getline函数:将一行读入到s并返回其长度*/
int getline(char s[],int lim)/*这里s的长度是由相应的实参数组决定的*/
{
int c,i;
for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)/*这里只能是i<lim-1,因为要考虑到存放'\n'*/
s[i] = c;
if(c == '\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/*copy函数,将from复制到to,这里假定to足够大*/
void copy(char to[], char from[])
{
int i;
i = 0;
while((to[i] = from[i]) != '\0')
++i;
}
请问程序中标红的i < lim -1是否有问题?我认为在数组末尾应该留出两个字符位置,一个给'\n',另一个给'\0',所以我认为应该是i < lim -2。不知哪位大虾能解释一下?
------解决方案--------------------
#include<stdio.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/*打印输入最长的行*/
main()
{
int len;/*当前行长度*/
int max;/*目前发现的最长行的长度*/
char line[MAXLINE];/*当前的输入行*/
char longest[MAXLINE];/*用于保存最长的行*/
max = 0;
while((len = getline(line,MAXLINE)) > 0)
if(len > max)
{
max = len;
copy(longest, line);
}
if(max > 0) /*存在这样的行*/
printf("%s", longest);
return 0;
}
/*getline函数:将一行读入到s并返回其长度*/
int getline(char s[],int lim)/*这里s的长度是由相应的实参数组决定的*/
{
int c,i;
for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)/*这里只能是i<lim-1,因为要考虑到存放'\n'*/
s[i] = c;
if(c == '\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/*copy函数,将from复制到to,这里假定to足够大*/
void copy(char to[], char from[])
{
int i;
i = 0;
while((to[i] = from[i]) != '\0')
++i;
}
请问程序中标红的i < lim -1是否有问题?我认为在数组末尾应该留出两个字符位置,一个给'\n',另一个给'\0',所以我认为应该是i < lim -2。不知哪位大虾能解释一下?
------解决方案--------------------
- C/C++ code
//书上是对的,因为不需要预留两个位置 //条件语句i <lim-1 && (c=getchar())!=EOF && c!='\n'当是i < lim - 1不符合时,(c=getchar())!=EOF 和下 //面的if语句不会执行,当是c!='\n'不符合时,说明i <= lim - 2时,所以下面的空间也够的,返回值也正确 int getline(char s[],int lim)/*这里s的长度是由相应的实参数组决定的*/ { int c,i; for(i=0; i <lim-1 && (c=getchar())!=EOF && c!='\n';++i)/*这里只能是i <lim-1,因为要考虑到存放'\n'*/ s[i] = c; if(c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; }