我有下一个练习:编写一个程序来打印超过10个字符的所有输入行。
我写了这个:
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
#define NEED 10 //minimum lenght of a line to be printed
int main()
{
int len;//length of last line
char line[MAXLINE];//current line
char lines[1000];//array with all lines
int i;//current array zone for write
i = 0;
while ((len = getline(line, MAXLINE)) > 0)//get one line from user
if (len > NEED){//if length of its is bigger than NEED
i = copy(line, lines, i);//write character by character in lines
}
printf("%s", lines);//print lines
return 0;
}
/* getline: read a line into s, return length */
int getline(char s[],int lim)
{
int c, i;
for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)//get the line
s[i] = c;//character by character
s[i] = '\n';//and add new line(\n) at last of its
return i;//return length of line
}
// copy a character array to another and return last wrote zone of array
int copy(char from[], char to[], int i)
{
int j=0;
while(from[j] != '\0'){
to[i]=from[j];
i++;
j++;
}
return i;
}
当我运行这个并输入大于10个字符的几行时,编程打印行和一些更奇怪的字符。我发布了一张照片链接。为什么会这样?
答案 0 :(得分:2)
在getline()
函数中,
s[i] = '\n';
你在字符串的末尾添加了\n
(换行符)但字符串应以\0
结尾(C中的字符串以此字符终止)所以请使用,
s[i] = '\0';
答案 1 :(得分:0)
您必须记住C中的字符串已终止,每个字符串末尾都有一个额外的特殊字符作为终结符。如果该字符不存在,则所有字符串处理函数将继续,直到找到终结符,这可能是相当远的。如果在字符串外读取(并可能写入)函数,则会导致undefined behavior。{/ p>
如果您使用标准函数来读取和复制字符串,则会为您处理,但现在您必须手动添加终止符'\0'
。
答案 2 :(得分:0)
此外,在将整个数据复制到最后的新字符串(行)后,您必须附加'\0'
个字符。
lines[i] = '\0';
printf("%s", lines);//print lines
答案 3 :(得分:0)
请参考下面的“getline”函数
int getline(char s[], int lim) //Reads line into s and returns its length
{
int c,i;
//Performs error checking to not exceed allowed limit
for(i=0;i<lim-1 && ((c= getchar())!=EOF) && c!='\n';++i)
s[i] = c;
if(c == '\n') //We add newline only if it's entered
{
s[i] = c;
++i;
}
s[i] = '\0'; //Puts null char to mark the end of string
return i;
}
我们使用
if(c=='\n')
确保只有按下回车键才能将新行存储在数组中 并将其与EOF区分开来并超过最大输入大小1000
无论输入什么,一旦我们退出“for”循环,
s[i] = '\0'
必须使用将此空字符附加到字符串的结尾。 这个语句用于确保数组知道它何时结束,以便在程序的后期部分我们可以使用它作为参考来查找数组的末尾及其大小
对于您的主程序,而不是使用“复制”功能,下面的代码应该足以打印输出
if(len>MAXNEED)
printf("Printed line - %s - ", lines);