0

プロセスが停止するまでファイルを作成するプログラムを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個のファイルしか作成しないことです。

4

2 に答える 2

3

sprintfのsizeof(v)呼び出しでは、charポインタのサイズ(この場合はおそらく4)です。これは、フォーマットされた文字列に最大3文字、または0〜999の数字が含まれることを意味します。これを修正するには、使用したのと同じ長さを使用します。メモリを割り当てるには:

    size_t len = cifre(i)+10;
    v = (char*)malloc(len);
    snprintf(v,len,"%ld",i);
于 2013-02-09T10:24:28.810 に答える
1

snprintf(v,sizeof(v)動的に割り当てられた配列のサイズではなく、sizeof(v)ポインタのサイズ(vis )を返すため、あまり意味がありません。char*したがって、-1文字、つまり3桁とNUL文字列ターミネータのsnprintf()印刷のみに制限されます。sizeof(v)3桁の値は、000から999、正確には1000までの値を示します。

于 2013-02-09T10:25:04.250 に答える