【问题标题】:Why does function return garbage values including the real output and how to clear that garbage?为什么函数返回垃圾值,包括实际输出以及如何清除这些垃圾?
【发布时间】:2021-12-20 16:52:31
【问题描述】:

我写了一个子字符串函数,它接受一个值 char 数组、初始值和长度,然后返回一个子字符串

char* substring(char t[],int i,int l){
int k=0;
char* subs=new char[l];
while(t[k]!=0){
    if(k==i){
        int a=i;
        int j=0;
        // for (int j=0;j<l;j++)
        while(j<l)
        {
            subs[j]=t[a];
            a++;
            j++;
        }
        if(subs!=0){
            break;
        }
    }
    k++;
    
}
return subs;
}



// CHECKING

int main(){
  char t[20]="this is a string";
  cout<<substring(t,0,4);

}

//OUTPUT 
this└

一切正常,得到我想要的准确输出,但在输出值的末尾,它还返回一个意外的值,例如符号和随机字母不知道如何摆脱它 **注意我不想使用字符串或其他任何东西,只是想解决这个程序中的问题

【问题讨论】:

  • C 字符串以 null 结尾。您忽略了这一点,这就是为什么建议不要使用 C 字符串的原因。您还尝试仅使用指针返回数组。一般来说,这不会有好的结局。
  • 你的 while 循环看起来也很糟糕。为什么要检查你是否从正确的地方开始?为什么不在正确的地方开始?也许在进入循环之前做一些基本的边界检查,并可能访问你没有业务的内存。使用有意义的变量名,使代码更易于阅读。并将正确的格式设置为顶部的樱桃。
  • 我建议 std::string
  • 这能回答你的问题吗? Why is a null terminator necessary?

标签: c++ arrays function pointers


【解决方案1】:

这是修复函数​​的最小更改——更改分配大小并终止子字符串。您可能需要考虑外部循环是否值得——如果子字符串在字符串末尾之后开始,您不应该返回一个空字符串而不是一个未初始化的字符串吗?还是应该返回 null 来表示错误? 这是一个风格问题,但内部循环可能更容易理解为: for (j = 0; j &lt; l; j++) { subs[j] = t[i+j]; }.

char* substring(char t[], int i, int l)
{
    int k = 0;
    char* subs = new char[l + 1];
    while (t[k] != 0) {
        if (k == i) {
            int a = i;
            int j = 0;
            // for (int j=0;j<l;j++)
            while (j < l) {
                subs[j] = t[a];
                a++;
                j++;
            }
            subs[j] = '\0';
            break;
        }
        k++;
    }
    return subs;
}

// CHECKING

int main()
{
    char t[20] = "this is a string";
    cout << substring(t, 0, 4);
}

【讨论】:

  • 一个好的答案会提到内存泄漏。
  • @drescherjm 虽然它对大多数人来说更漂亮,但重新格式化代码会阻碍差异;与以前一样,OP 可以将源与原始源进行比较以突出显示更改。
  • 我不确定原始格式是否是故意的。许多新用户不知道如何正确格式化代码块。
  • 我认为答案应该尽可能包含最佳实践。鉴于这个问题,我怀疑是否存在差异。
  • 这不是如何编写子字符串函数的答案。这是对why is *this* program not working 的回答。
猜你喜欢
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
相关资源
最近更新 更多