C语言中的Printf和Strcpy Bug
Printf and Strcpy Bug in C language
这里我写了一段代码。长数相加函数(用字符串表示数字)
我想知道我在用 C 编写代码时经常遇到的两个错误
- 关于 printf 语句,有时在删除一些 printf 语句时我会遇到逻辑错误,但在将它们放回去时代码运行完美。我不明白为什么,请告诉我如何避免这些错误。
例如。在下面的代码中,代码中提到的行(在该行前面指定的注释)在对其进行注释或删除后,"Answer" 变量接收空白字符串(案例 1)并取消注释返回正确的输出(案例 2)
- 关于 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
将超出范围,留下一个杂散指针。
这里我写了一段代码。长数相加函数(用字符串表示数字)
我想知道我在用 C 编写代码时经常遇到的两个错误
- 关于 printf 语句,有时在删除一些 printf 语句时我会遇到逻辑错误,但在将它们放回去时代码运行完美。我不明白为什么,请告诉我如何避免这些错误。
例如。在下面的代码中,代码中提到的行(在该行前面指定的注释)在对其进行注释或删除后,"Answer" 变量接收空白字符串(案例 1)并取消注释返回正确的输出(案例 2)
- 关于 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
将超出范围,留下一个杂散指针。