我正在为家庭作业编写代码,该代码使用函数和指针来读取文件并修复其中的大小写错误。
目标是读取预先写好的文件并修复它,在每行的开头添加行号。 (即,tiTle - > 1. Title)
我认为我已经掌握了基本逻辑,但肯定有一个我没有看到的错误,因为它在编译运行后立即停止响应。
这是我的main()函数。
FILE *casefixer;
casefixer = fopen("casefixer.txt", "r+");
char* ch;
int* char_in_word;
int* line_num;
*char_in_word = 0;
*line_num = 1;
while((fscanf(casefixer, "%c", ch)) != EOF){
fscanf(casefixer, "%c", ch);
fprintf(casefixer, "%d. ", *line_num);
if(fix_caps(ch, char_in_word, line_num))
fprintf(casefixer, "\n");
fix_caps(ch, char_in_word, line_num);
fprintf(casefixer, "%c", *ch);
}
fclose(casefixer);
答案 0 :(得分:2)
char* ch; // uninitialized
int* char_in_word; // -||-
int* line_num; // -||-
*char_in_word = 0; // dereferencing uninitialized pointer - undefined behavior
*line_num = 1; // -||-
在函数声明中看到它们时,不必使用指针。如果您确定该函数不会存储它们或尝试为它们分配新内存,请使用常规变量的地址:
char ch;
fscanf(casefixer, "%c", &ch) // ch is on stack longer than fscanf, everything's OK
答案 1 :(得分:0)
while((fscanf(casefixer, "%c", ch)) != EOF)
中调用了它。在这两行中:
if(fix_caps(ch, char_in_word, line_num))
fprintf(casefixer, "\n");
如果我理解正确,你应该在这个if语句中使用“continue”。