我正在刷新我的C技能。我尝试使用以下代码来学习itoa()
函数的用法:
#include<stdio.h>
#include<stdlib.h>
void main(){
int x = 9;
char str[] = "ankush";
char c[] = "";
printf("%s printed on line %d\n",str,__LINE__);
itoa(x,c,10);
printf(c);
printf("\n %s \n",str); //this statement is printing nothing
printf("the current line is %d",__LINE__);
}
我得到了以下输出:
ankush printed on line 10
9
//here nothing is printed
the current line is 14
问题是如果我从代码中评论语句itoa(x,c,10);
,我会打印上面提到的语句并得到以下输出:
ankush printed on 10 line
ankush //so i got it printed
the current line is 14
这是itoa()
的行为还是我做错了什么。
问候。
答案 0 :(得分:1)
正如大家在注释中指出的那样,变量c
表示的数组大小为1.由于C要求字符串具有NULL终止符,因此只能在{{1}中存储长度为0的字符串}}。但是,当你调用c
时,它不知道你处理它的缓冲区只有1个字符长,所以它会很高兴在itoa
之后继续将数字写入内存(这是可能是包含c
)的内存。
要解决此问题,请声明str
的大小足以处理您计划放入其中的字符串,并为NULL终止符加1。 32位c
可容纳的最大值为10位数,因此您可以使用int
。
为了进一步解释上面的内存覆盖情况,我们考虑在堆栈上的连续区域中分配char c[11]
和c
(因为它们是局部变量)。所以str
可能占用内存地址1000(因为它是一个零字符串加上一个NULL终止符),而c
将占用内存地址1001到1008(因为它有6个字符,加上NULL终止符) 。当你尝试写字符串&#34; 9&#34;在str
中,数字9被放入存储器地址1000,并且NULL终止符被放入存储器地址1001.由于1001是c
的第一个地址,str
现在代表零 - length string(任何其他字符之前的NULL终止符)。这就是你得到空白的原因。
答案 1 :(得分:0)
c必须是一个足够长的缓冲区来保存你的号码。
写
char c[20] ;
而不是
char c[] = "";