C语言中的Printf和Strcpy Bug

时间:2015-01-01 18:16:10

标签: c printf strcpy c-strings

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

我想知道在C

编码时我经常遇到的两个错误
  1. 关于printf语句,有时在删除一些printf语句时会出现逻辑错误,但在将它们放回去时代码运行完美。我不明白为什么,也让我知道如何避免这些错误。
  2. EG。在下面的代码中,代码中提到的行(在该行的前面注释的注释)在回复或删除之后,"回答"变量接收空字符串(情况1)并取消注释它给出正确的输出(情况2)

    1. 关于strcpy函数,有时它表现得很奇怪的错误或类比是什么
    2. EG。在上面提到的案例2中,即使"添加"函数返回正确的输出为什么它没有被正确复制到"答案"变量

      enter image description here

      代码在这里

      #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]='\0';
          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;
      }
      

1 个答案:

答案 0 :(得分:3)

你有undefined behavior,因为你返回一个指向局部变量的指针。一旦函数返回,c函数中的数组add将超出范围,留下一个迷路指针。