首先,代码的差异是而不是与sscanf
,但与sprintf
。代码的差异说明:
--- ac.c 2014-05-24 14:31:18.074977661 -0500
+++ tle.c 2014-05-24 14:30:52.270650109 -0500
@@ -4,7 +4,7 @@
string mul(string m, int n){
char a[4];
-sprintf(a,"%d",n);
+sprintf(a,"%d%c",n,'\0');
int l1 = strlen(a);
//printf("len : %d\n",l1);
int l2 = m.length();
其次,通过明确地包装在一起%c
和'\0'
字符串,你正在减少,可以通过1存储在整数的大小,您需要检查返回sprintf的。 man printf:
成功返回后,这些函数返回打印的字符数(不包括用于结束输出到字符串的尾部'\ 0')。
在您的情况下,您很可能会写入超出a[4]
字符串的末尾,并且遇到未定义的结果。有a[4]
您只有999\0
的空间。当您明确添加%c
+ '\0'
时,您将其减少到99\0\0
。如果您的编号超过99,那么sprintf将写入超出字符串的末尾,因为您明确打包了额外的'\ 0'。在原始情况下,sprintf(a,"%d",n);
999可以存储在没有问题的情况下依靠sprintf将'\ 0'附加为[3]。
测试与n = 9999
,sprintf的仍数存放在,但将返回5
超过可用a[4]
的空间,这意味着你的代码的行为是一个骰子滚在这一点上。
这两个代码片段都没有包含'sscanf'。第一个'sscanf'显然是错误的(尝试读入一个字符常量?),第二个是有问题的('n'是一个指针?) – hobbs
对不起,这个问题是关于'sprintf()'而不是'sscanf() '。 和n是一个整数变量,它始终小于100 – hkbharath