**我理解了getline函数是如何工作的,它只是在每个s[]数组地址中赋值,因为函数参数有局部作用域,不会因为使用不同的数组名称而发生冲突,除非它共享相同的数据类型,但我关心的是为什么line[]函数对实际的字符串没有影响。如果上面的理解是错误的,以及为什么检查器函数不起作用,请纠正我。**预期的结果是,得到的字符串没有尾随空格和制表符,而不是我输入的实际输入('\s'hello World'\t')。
#define MAXLINE 50
int getline(char line[], int max);
int checker(char line[]);
int main(){
char line[MAXLINE];
while( getline(line, MAXLINE) > 0 )
if( checker(line) > 0 )
printf("%s",line);
return 0;
}
int getline(char s[],int lim){
int c,i,j;
j=0;
for(i=0; (c=getchar()) != EOF && c != '\n';i++){
if(i < lim-1){
s[j]=c;
++j;
}
}
if(c == '\n'){
s[j] = c;
++j;
++i;
}
s[j] = '\0';
return i;
}
int checker(char s[]){
int i;
i=0;
while(s[i] != '\n' )
++i;
--i;
while(i >= 0 && (s[i] == ' ' || s[i] == '\t') )
i++;
if( i >= 0){
++i;
s[i] = '\n';
++i;
s[i] = '\0';
}
return i;
}发布于 2021-07-04 13:16:42
bug似乎出现在这里:
while(i >= 0 && (s[i] == ' ' || s[i] == '\t') )
i++;
^^^^
This shall probably be i--;也就是说..。您的功能不安全。它缺少一些检查来阻止对char数组外部的访问。
例如:
getline函数也有一个问题。如果输入长度大于lim,代码将执行越界的s[lim] = '\0';。
发布于 2021-07-04 13:18:11
如果您尝试从字符串中裁剪尾随空格和制表符,请尝试将checker()中第二个while循环的内容更改为包含i--而不是i++。
由于checker()的目的是更改字符串,因此使用不同的名称可能更好。“检查”这个词通常并不意味着修改。一个选择得当的名字对下一个遇到你的代码的人有很大的帮助。
https://stackoverflow.com/questions/68241745
复制相似问题