【问题标题】:Variable Substitution in CC中的变量替换
【发布时间】:2016-04-22 18:02:04
【问题描述】:

我想打开一个文件。很容易。使用 fopen()。但是,打开什么文件取决于用户输入。我有点精通 Korn Shell 脚本,这很容易使用变量替换:$(var)。我无法在 C 中找出正确的格式。有人可以给我一些见解吗? 我的代码 -

 #include <stdlib.h>
 #include <stdio.h>

 char statsA[100];
 char fileA[50];

 int main (void)
 {

 printf("Enter file to open\n");
 gets(fileA);


 FILE *statsA;
 statsA = fopen("c:/Users/SeanA/C/***<fileA>***", "r+");

 .......................................^ What goes here?

我不确定如何在 fopen 字符串中包含用户输入。

【问题讨论】:

  • 尝试查看sprintf函数。
  • 或者更好,snprintf
  • 强制:不要使用gets,因为使用它用户可以总是使您的程序崩溃,并且它也已从当前标准 C 中删除(正因为如此) .
  • 您需要使用上述方法之一构建一个结合路径和文件名的新字符串。

标签: c variables substitution


【解决方案1】:

您必须手动连接两个字符串。像这样的

char* folder = "c:/Users/SeanA/C/";
char* path = malloc(strlen(fileA) + strlen(folder) + 1);
path = strcpy(folder);
path = strcat(fileA);

FILE *statsA = fopen(path, "r+");

free(path);//Always free your memory

【讨论】:

    【解决方案2】:

    这就是sprintf 的用途。它的工作方式类似于printf,只是它的输出是一个字符串而不是stdout

    char filename[100];
    sprintf(filename, "c:/Users/SeanA/C/%s", fileA);
    statsA = fopen(filename, "r+");
    

    此外,statsA 的定义在 main 内部会掩盖文件范围内的定义。你可能想给这些不同的名字。

    【讨论】:

      【解决方案3】:

      执行scanf 以从用户那里获取文件。

      创建一个 char 数组来保存文件名。

      char filename[15];

      现在询问文件名:

      printf("What is the name of the file?\n");

      scanf("%s", &amp;filename);

      注意:包括完整的文件名。所以如果我有一个名为filename 的文本文档,用户需要输入filename.txt

      现在你有了可以声明文件指针的文件名

      FILE * fp;

      fp = fopen(filename, "r");

      现在您应该可以扫描您的文件了!

      fscanf(fp, "%d", &amp;value);

      编辑:我没有注意到您想要将字符串连接到您的文件路径。

      由于您知道预定义的路径,您可以创建另一个保存该字符串路径的 char 数组

      char fullPath[100];

      char path[75] = "c:/Users/SeanA/C/";

      现在您可以使用strcat 将它们组合在一起!

      strcat(fullPath, path);

      strcat(fullPath, filename);

      现在你可以fopen(fullPath, "r");

      【讨论】:

      • 请注意,如果文件名包含空格,您的scanf 将失败...并且还存在与gets 完全相同的缓冲区溢出问题。
      • 无论如何,问题是关于如何在 C 中进行字符串连接,而您的答案似乎没有回答。
      • 确实如此,但出于他的目的,他可能不会太担心这一点。我想在 scanf 文件名中,我们可以把它放在 if 语句中,看看它是否等于 1。如果没有,那么我们就会出错。
      • @hyde 啊我没注意到!给我一秒钟,我会解决这个问题。
      • @hyde 这样更好吗?
      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2013-12-30
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多