我正在尝试从a迭代到x并创建文件a.dat,b.dat,...,x.dat
int main()
{
char letter = 'A';
FILE *fp;
while (letter < 0x59) {
printf("%c", letter);
char *fname = "";
fname[0] = letter;
fname= strcat(fname, ".dat");
const char * fnam = fname;
fp = fopen(fnam, "ab+");
fclose( fp );
letter++;
}
return 0;
}
它迭代字母就好了,但这一行
fname[0] = letter;
使用&#34;分段错误&#34;崩溃程序错误。在调试器中,它表示&#34;无法访问地址处的内存。&#34; 我想用字母和#34; .dat&#34;来创建一个字符串,为此我创建一个空字符串并通过为其0元素指定其值来使其成为我想要的第一个字符。信件。但它不起作用,我不明白为什么。
答案 0 :(得分:4)
只需使用char数组作为文件名:
char filename[] = "_.dat";
for (char letter = 'A'; letter <= 'X'; ++letter) {
filename[0] = letter;
FILE* fp = fopen(filename, "ab+");
// etc.
}
答案 1 :(得分:1)
您正在使用长度为0(""
)的字符串文字,然后尝试(a)为其分配新数据(未定义)和(b)附加到它(进入未分配的空间)。
相反,您需要一个可以安全修改的字符缓冲区:
int main()
{
char letter = 'A';
char fname[] = "?.dat";
FILE *fp;
while (letter < 'Y') {
printf("%c", letter);
fname[0] = letter;
fp = fopen(fname, "ab+");
fclose( fp );
letter++;
}
return 0;
}
答案 2 :(得分:1)
由于下面列出的原因,这不起作用(参见评论; UB代表未定义的行为)
char *fname = ""; // Assign a non-modifiable pointer to fname
fname[0] = letter; // Trying to modify data at that pointer - UB
fname= strcat(fname, ".dat"); // Trying to write data past the end of buffer - UB
以下是解决此问题的方法:
char fname[] = "-.dat"; // Create a writable array of chars
fname[0] = letter; // Now this assignment is allowed
// strcat is not required, because .dat is already in place
请注意,如果您在C ++中编译它,您会在第一行看到错误,因为与C不同,C ++会考虑字符串文字const char*
。这也会在下一行捕获赋值,并调用strcat
。
答案 3 :(得分:1)
在使用之前必须分配一个空格 执行此语句时,您尝试修改文字字符串,这是不允许的
fname[0] = letter;
你必须做那样的事情
#define MAX_NAME_SIZE 20
fname = malloc(20);
或使用分配到堆栈中的数组
char fname[MAX_NAME_SIZE];
答案 4 :(得分:0)
你需要这个:
int main()
{
char letter = 'A';
FILE *fp;
while (letter <= 'Z') {
char fname[100] = "";
fname[0] = letter;
fname[1] = 0 ;
strcat(fname, ".dat");
fp = fopen(fname, "ab+");
fclose( fp );
letter++;
}
return 0;
}