首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于函数和字符数组在函数参数中如何工作的模糊概念

关于函数和字符数组在函数参数中如何工作的模糊概念
EN

Stack Overflow用户
提问于 2021-07-04 12:37:04
回答 2查看 33关注 0票数 0

**我理解了getline函数是如何工作的,它只是在每个s[]数组地址中赋值,因为函数参数有局部作用域,不会因为使用不同的数组名称而发生冲突,除非它共享相同的数据类型,但我关心的是为什么line[]函数对实际的字符串没有影响。如果上面的理解是错误的,以及为什么检查器函数不起作用,请纠正我。**预期的结果是,得到的字符串没有尾随空格和制表符,而不是我输入的实际输入('\s'hello World'\t')。

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

发布于 2021-07-04 13:16:42

bug似乎出现在这里:

代码语言:javascript
复制
while(i >= 0 && (s[i] == ' ' || s[i] == '\t') )
    i++;
    ^^^^
    This shall probably be i--;

也就是说..。您的功能不安全。它缺少一些检查来阻止对char数组外部的访问。

例如:

  • 如果输入字符串没有'\n‘,会发生什么?

  • 如果输入字符串是空格后跟'\n‘,会发生什么?

getline函数也有一个问题。如果输入长度大于lim,代码将执行越界的s[lim] = '\0';

票数 0
EN

Stack Overflow用户

发布于 2021-07-04 13:18:11

如果您尝试从字符串中裁剪尾随空格和制表符,请尝试将checker()中第二个while循环的内容更改为包含i--而不是i++

由于checker()的目的是更改字符串,因此使用不同的名称可能更好。“检查”这个词通常并不意味着修改。一个选择得当的名字对下一个遇到你的代码的人有很大的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68241745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档