我试图解开这段代码中的谜团,但没有成功。以下程序用于打印输入的长度和行。它的最大限制为 10 个字符,对于超过 10 个字符的行,它计算所有字符但只存储 10 个。
令我困惑的是,在输出中,当输入超过 10 个字符的行时,它会打印输入的前 11 个字符,而我将该行存储在 10 个字符大小的数组中。怎么可能?
我在 Linux Mint 中使用 GCC 编译器。
#include<stdio.h>
#define MAX 10
int Getline(char arr[], int lim);
void main(){
int len=0;
char c=0;
char line[MAX]={};
len=Getline(line,MAX);
printf("%d\n%s",len,line);
printf("\nDo you want to continue?\t");
while((c=getchar())=='y'){
len=Getline(line,MAX);
printf("\n%d\n%s",len,line);
printf("\nDo you want to continue?\t");
}
}
int Getline(char line[], int lim){
int i=0;
while((line[i]=getchar())!='\n' && i<lim){
i++;
}
if(line[i]=='\n' && i<lim)
{
line[i]='\0'; // This is line[lim+1]
return i;
}
else if(i==lim){
while(getchar()!='\n')
i++;
return i+1;
}
}
输入输出如下图,我用的是linux mint中的gcc编译器。
输出:
Queen
5
Queen
Do you want to continue? yQueenOfDragons
14
QueenOfDrag
Do you want to continue? y123456789012345
15
12345678901
Do you want to continue? yYouKnowNothingJonSnow
21
YouKnowNoth
Do you want to continue? n
另外,当我按如下方式在 while 循环中交换测试条件时
while(i<lim && (line[i]=getchar())!='\n')
当行长超过限制时,它会在打印前 10 个字符后打印一个奇怪的“@”字符。输出如下所示
输出 2:
Queen
5
Queen
Do you want to continue? yQueenOfDragons
13
QueenOfDra@
Do you want to continue? y12345678901
10
1234567890@
Do you want to continue? yYouKnowNothingJonSnow
20
YouKnowNot@
Do you want to continue? n
请解释奇怪的行为。提前致谢!
PS:这是 Dennis M Ritchie 和 Brian Kernighan 的“The C Programming Language”中的练习 1-16。
最佳答案
我怀疑它正在打印第 11 个字符,因为这个 while 表达式:
while((line[i]=getchar())!='\n' && i<lim){
i++;
}
当 i < lim
返回false,你已经放了getchar()
的结果在line[i]
.
此外,请记住始终为空终止符留出空间并完成字符串。 Getline(line, lim)
并不总是在 line
处放置一个以 null 结尾的字符串.
关于使用 %s 打印时,大小为 10 的字符数组显示 11 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50090720/