我有以下 C 代码,它将给程序的单词写入名为“command.txt”的文件。如果单词是“退出”程序结束,否则它打印单词并将其写入文件。但是,如果单词是"file",它会使用函数 getstring() 获取文件第一行的第一个单词,然后继续下一个循环迭代。然后在新一轮中使用这个词,代码直接进入“else”分支,应该打印出这个词并将其再次写入文件。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void getstring(char **p) {
char string[100];
char *word = NULL;
FILE *file = fopen("command.txt", "r");
fgets(string, 100, file);
word = strtok(string," \n");
p[0] = word;
fclose(file);
}
void writetofile (char **strarr) {
FILE *file = fopen("command.txt", "a");
fprintf(file, "%s\n", strarr[0]);
fclose(file);
}
int main(void) {
char line[100];
char *word = NULL;
char *strarr[5];
char **p = NULL;
int flag = 0, i;
while (1) {
if (flag == 1) {
flag = 0;
}
else {
printf("Give string: ");
fgets(line, 100, stdin);
word = strtok(line," \n");
strarr[0] = word;
}
if (strcmp(strarr[0], "quit") == 0) {
break;
}
else if (strcmp(strarr[0], "file") == 0) {
p = strarr;
getstring(p);
flag = 1;
continue;
}
else {
printf("Text: %s\n", strarr[0]);
writetofile(strarr);
}
for (i=0; i<5; i++) {
strarr[i] = NULL;
}
}
return 0;
}
问题是这样的:如果我输入"file",则没有任何内容写入文件。例如,如果我给出单词“hello”、“file”和“world”,然后退出程序,打印输出如下所示:
Give string: hello
Text: hello
Give string: file
Text: hello
Give string: world
Text: world
Give string: quit
command.txt 看起来像这样:
hello
world
所以,有一个空行应该是另一个“你好”。为什么是这样?我在这里遗漏了一些明显的东西还是因为指针的使用方式?
最佳答案
有一个可能的问题是您在 getstring()
中返回了一个指向局部变量的指针:
void getstring(char **p) {
char string[100];
char *word = NULL;
...
word = strtok(string," \n");
p[0] = word; //word points into string[] which is a local
...
}
从 getstring()
返回后,局部变量 string[]
不再有效,因此稍后访问 p[0]
是未定义的行为。
要解决此问题,请将单词复制到固定缓冲区或为返回字符串分配内存。
关于c - 为什么 C 程序将空行打印到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26702352/