0

我有这个 C 函数,对我来说它似乎以两种方式随机运行: 1. 仅当输入了“menu”并因此调用了 user_cfg 时,while-loop 在指向现有路径后继续运行几次文件作为输入输入,然后返回。2. 如下所示,当输入现有文件的路径作为输入时,出现分段错误。据我所见,我没有更改代码中的任何内容,因为它在 30 分钟前正常工作(除了上面提到的问题)。

char *user_cfg() {
   printf("\nProvide the path for the configuration file or enter \"menu\" to go back:\n");
   char escape[5] = {"menu"};
   char buf[101] = {0};
   char path_input[101] = {0};
   char *userSpecifiedFilepath;

   do {
     if (fgets (buf, sizeof(buf), stdin) != NULL)
       if (sscanf(buf, "%s", &path_input)) {
         userSpecifiedFilepath = path_input;
         if (*path_input == *escape)
           user_cfg();
       }
      } while (!file_exists(userSpecifiedFilepath));
   return userSpecifiedFilepath;
}

bool file_exists(const char *filename) {
  FILE *file;
  file = fopen(filename, "r");
  fclose(file);
  if (file != NULL) {
    return true;
  }
  return false;
}
4

2 回答 2

2

您正在返回局部变量的地址。这是一个未定义的行为,可能是分段错误的原因。

解决此问题的一种简单(但不是正确的:p)方法是将您的声明path_input为静态的。

static char path_input[101] = {0};

在尝试运行代码之前修复警告可以帮助您避免这些基本问题。

userSpecifiedFilepath如果fgets失败,价值是多少?

于 2013-05-13T17:57:42.180 回答
1

in file存在,if语句错误。文件将成为一个指针或 NULL '\0',它不会评估你想要的方式。你应该把file=设为fopen,然后检查它是否为NULL。如果不是,则返回 true。

于 2013-05-13T17:16:22.007 回答