代码进入无限循环。如果我删除内部for循环内的所有行并替换为printf()
它可以正常工作。但保持这些界限,它会进入无限循环。
如何解决此问题? #include
#include <string.h>
void itoa(int, char[]);
void reverse(char[]);
int main()
{
int i,j;
for(i = 0;i<= 4; i++)
{
for (j = 0; j <= 9; j++)
{
char fileName[10]="A";
char append[1];
itoa(i,append);
strcat(fileName,append);
itoa(j,append);
strcat(fileName,append);
printf("i=%d j=%d\n", i,j);
printf("%s\n", fileName);
}
}
}
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* record sign */
n = -n; /* make n positive */
i = 0;
do { /* generate digits in reverse order */
s[i++] = n % 10 + '0'; /* get next digit */
}
while ((n /= 10) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
void reverse(char s[])
{
int i, j;
char c;
for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
答案 0 :(得分:3)
该程序使用这段代码调用正式名称为 undefined behavior 的内容:
char append[1];
itoa(i,append);
itoa()
正在追加多个元素。可能一个字节超过append[]
(即append[1]
)是其中一个循环变量(main::i
或main::j
)的一部分,这导致无限循环。
答案 1 :(得分:3)
使用sprintf
来做这种事情会更加简单和清晰,例如。
char fileName[32];
sprintf( filename, "A%d%d", i, j );
printf("%s\n", fileName);
注意,总是使字符串缓冲区大于它们所需的范围。