我一直在尝试用C/C++制作一个程序,该程序可以创建文件,直到进程停止。文件名从0开始,并遵循算术顺序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long cifre(long x) //returns the number of digits a number has
{
int nr = 0;
while (x != 0)
{
x = x/10;
nr++;
}
return nr;
}
int main()
{
long i=0;
FILE* g;
char* v;
char buffer[1025];
int j=0;
for (j=0;j<1024;j++)
buffer[j] = 'x';
while (1)
{
v = (char*)malloc(cifre(i)+10);
snprintf(v,sizeof(v),"%ld",i);
g = fopen(v,"w");
fprintf(g,"%s",buffer);
free(v);
fclose(g);
i++;
}
return 0;
}
问题是该程序只创建了1000个文件。
sprintf调用中的sizeof(v)
是一个char指针的大小,在您的情况下可能是4,这意味着格式化的字符串最多包含3个字符,或者0到999之间的数字。要修复此问题,请使用与分配内存相同的长度:
size_t len = cifre(i)+10;
v = (char*)malloc(len);
snprintf(v,len,"%ld",i);
snprintf(v,sizeof(v)
没有多大意义,因为sizeof(v)
返回指针的大小(v
是char*
),而不是动态分配的数组的大小。因此snprintf()
仅限于打印sizeof(v)
-1个字符,或3位数字和NUL字符串终止符。3位数字表示000到999之间的值,精确到1000。