C语言中的Printf和Strcpy Bug

Printf and Strcpy Bug in C language

这里我写了一段代码。长数相加函数(用字符串表示数字)

我想知道我在用 C 编写代码时经常遇到的两个错误

  1. 关于 printf 语句,有时在删除一些 printf 语句时我会遇到逻辑错误,但在将它们放回去时代码运行完美。我不明白为什么,请告诉我如何避免这些错误。

例如。在下面的代码中,代码中提到的行(在该行前面指定的注释)在对其进行注释或删除后,"Answer" 变量接收空白字符串(案例 1)并取消注释返回正确的输出(案例 2)

  1. 关于 strcpy 函数,它的错误或类比是什么,它有时表现得很奇怪

例如。在上面提到的情况 2 中,即使 "add" 函数返回正确的输出,为什么它没有被正确复制到 "Answer" 变量中。

代码在这里

#include<stdio.h>
#include<string.h>
char *strrev(char *str)
{
      char *p1, *p2;

      if (! str || ! *str)
            return str;
      for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
      {
            *p1 ^= *p2;
            *p2 ^= *p1;
            *p1 ^= *p2;
      }
      return str;
}
char* add(char a[],char b[]){
    int n1=strlen(a);
    int n2=strlen(b);
    char c[20],d[20];
    int i,j,k=0,carry=0,sum=0;
    for(i=n1-1,j=n2-1;i>=0 && j>=0;i--,j--){
        sum = (a[i]-'0')+(b[j]-'0')+carry;
        c[k++]=sum%10 + '0';
        carry=sum/10;
    }
    if(i>=0){
        for(;i>=0;i--){
            sum = (a[i]-'0')+carry;
            c[k++]=sum%10 + '0';
            carry=sum/10;
        }
    }
    else if(j>=0){
        for(;j>=0;j--){
            sum = (b[j]-'0')+carry;
            c[k++]=sum%10 +'0';
            carry=sum/10;
        }
    }
    if(carry){
        while(carry){
            c[k++]=carry%10 + '0';
            carry/=10;
        }
    }
    c[k]='[=10=]';
    printf("\nResult under function = %s",strrev(c));  //upon removing this printf statement the Result variable in main() receives a blank string

    return strrev(c);
}
int main(){
    char answer[20];
    printf("\nAnswer = %s\n",add("0","1"));
    strcpy(answer,add("0","1"));
    printf("\nNow Answer is %s \n",answer); // Here is the bug
    return 0;
}

undefined behavior 因为你 return 一个指向局部变量的指针。一旦函数 returns,add 函数中的数组 c 将超出范围,留下一个杂散指针。