【问题标题】:Scanf for char *pathchar *path 的扫描
【发布时间】:2013-08-03 15:55:34
【问题描述】:

我正在尝试从键盘(使用scanf)读取变量char *path 我不知道如何将 path 作为 scanf 的参数传递以从键盘获取输入。我该怎么做?

附:这是我尝试过的:

char *filePath = "";
printf("Path: "); scanf("%s", &filePath);

但我的应用程序总是停止。

【问题讨论】:

  • 您可以向我解释一下,而不是投反对票...
  • 我投了反对票,因为这个问题没有显示任何研究工作。是trivial to google for this
  • 我在google上搜索过,但没有找到我需要的东西,所以我认为最好在这里发布。我是一个有指针的新手。我目前正在了解它们......那么,你能删除你的反对票吗?
  • Char* p, and scanf的可能重复

标签: c scanf


【解决方案1】:
char *filePath = "";

编译器应该就上述声明警告您。 filePath 类型是 const char* 而不是 char*

filePath 指向一个空字符串文字。字符串文字位于只读位置,您无法对其进行编辑。

您必须使用malloc 分配和内存,然后接受输入。完成后,您需要free它。

【讨论】:

  • 为什么建议在堆栈变量上使用malloc
  • 此外,有点挑剔,字符串文字可能驻留在只读内存中。这不能保证。
  • @simonc 是的。我应该推荐堆栈变量。我认为在这种情况下很好。我同意您的第二条评论,但在大多数架构中,字符串文字位于只读段中。
  • 编译器不应警告将字符串文字分配给char *。这是 const-removal 的一个特例,由于 const 后期添加到 C 语言中而被明确允许。
【解决方案2】:

先给filePath分配足够的空间,然后不给&传递:

char filePath[128];
printf("Path: ");
scanf("%127s", filePath);

另一种方法是使用malloc

char *filePath = (char*) malloc(128 * sizeof(char));
...
free(filePath);

【讨论】:

    【解决方案3】:
    char *filePath = "";
    

    声明一个指向仅包含 nul 终止符的字符串文字的指针。这可能存在于只读内存中,因此无法修改。你需要一个更大的、可写的字符串来代替

    char filePath[200];
    if (scanf("%199s", filePath) != 1) {
        /* user didn't enter a string */
    }
    

    【讨论】:

      【解决方案4】:

      scanf 方法总是使用对您正在写入的变量的引用(因此通过非指针变量,您使用 & 来获取引用(内存地址))。 由于你使用的是指针,指针本身已经是对变量的引用,它指向变量的内存地址,因此不需要使用&。

      请务必始终为输入字符串分配足够的空间。 (ANSI)C 方式是使用 malloc(),较新的(C++ 和更高版本的 C 标准)是使用 new arrayname[size] 创建一个数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 2012-07-07
        • 1970-01-01
        • 2018-11-25
        • 2015-12-14
        • 2017-08-22
        相关资源
        最近更新 更多