c - 为什么 C 程序将空行打印到文件?

标签 c arrays pointers file-io

我有以下 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/

相关文章:

c中二维数组中整数的连续间隔输入

c - 如何调用另一个函数来获取字符串数据

c++ - 为什么与 C++ 相比,C 禁止向指针到指针的两个级别添加 const 限定?

c - 具有两个定义操作的随机访问循环数据结构

c - 访问 16 位 DLL

java - 逐个元素地添加数组中的数字

c - 内存地址和内存地址中的值

c - 数组初始化期间的类型

c - 无法在 C 中使用 qsort 对 dirent 进行排序

javascript - 使用 typescript/javascript 动态删除 json 中的特定元素