【问题标题】:What is the differrence between these functions?这些功能之间有什么区别?
【发布时间】:2012-12-19 11:23:35
【问题描述】:

我在 The C Answer Book 中找到了这段代码。

int readline(char s[], int lim) {
    int i,c,j=0;
    for(i=0; (c=getchar())!=EOF && c!='\n'; ++i) {
        if(i<lim-2) {
            s[j]=c;
            ++j;
        }
    }
    if(c=='\n') {
        s[j]=c;
        ++j;
        ++i;
    }
    s[j]='\0';
    return i;
}

我写了我的版本:

int readline(char line[], int lim) {
    int c, i;
    for(i=0; (c=getchar())!=EOF && c!='\n'; ++i) {
        if(i<lim-2) {
            line[i]=c;
        }
    }
    if(c=='\n') {
        line[i]=c;
        ++i;
    }
    line[i]='\0';
    return  i;
}

我只使用了一个变量“i”作为计数器,但原始版本使用了两个变量“i”和“j”作为计数器。 两者有什么区别?

请告诉我它们有何不同?

【问题讨论】:

    标签: c arrays string algorithm char


    【解决方案1】:

    函数的第二个版本未初始化 line 的一部分,并且在初始循环继续超出 i&lt;lim-2 的情况下,可能会在 line 缓冲区的末尾之外写入最终的 '\n'、'\0'

    【讨论】:

      【解决方案2】:

      如果用户输入的字符超过lim-2,则第一个版本可以正常工作,第二个版本会写到line 的末尾:

      if(c=='\n') {
          line[i]=c;  <<=== here
          ++i;
      }
      line[i]='\0';   <<=== and here 
      

      这并不意味着您实际上需要两个变量。您可以使用一个,但您必须在循环后将其封顶。做任何你认为使代码更容易阅读的事情。

      【讨论】:

      • 我如何“限制”变量?
      • @SandyLee_user53167:查看它是否大于最大值,如果是,则将其设置为该最大值。
      猜你喜欢
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2011-04-10
      • 2016-12-11
      相关资源
      最近更新 更多