【问题标题】:c: reading const char* into a variable in sscanf?c: 将 const char* 读入 sscanf 中的变量?
【发布时间】:2018-01-23 17:37:30
【问题描述】:

我正在尝试将字符串/*char 扫描到变量中并将其传递给函数,但我收到错误“format specifies type 'char *' but the argument has type 'const char *'”。我需要 *info 成为 const char,但如果我改变它,我会得到其他错误。

如何将const char *info 正确扫描到sscanf()

int main(int argc, char** argv) {
    blk *block;
    char *line;
    const char *info;

    block = block_new();

    printf("insert info");

    while ( (line = readline()) != NULL) {
        sscanf(line, "%s", info);
        insert(block, info);
        free(line);   
    }     
}

插入:insert(blk *block, const char *info)

当我更改为 char *info 而不是 const char 时,出现错误:

warning: variable 'info' is uninitialized when used here
sscanf(line, "%s", info);

note: initialize the variable 'info' to silence this warning
    char *info; = NULL

【问题讨论】:

  • 除了删除const 限定符以满足编译器的要求外,lineinfo 都是未初始化的变量。他们没有指出任何具体的事情。所以sscanf(line, "%s", info); 将无法做任何明智的事情,这是未定义的行为
  • 为什么你“需要*info成为一个常量字符”?
  • "我需要 *info 成为一个 const char" - 不,你需要它是一个适当长的 arraynon-const 字符,或指向适当大的、动态分配的 non-const 空间的指针。无论是否动态分配,空间的内容都不能是const,因为你需要修改它们(通过sscanf)。
  • 可以为const 参数提供非常量参数,但反之则不行。
  • 这个问题太笼统了——这不是一个教程服务!您可以使用比您期望的任何输入更长的固定长度数组,例如 char info[1000]; 并使用 sscanf(line, "%999s", info); 限制输入,或者您可以跟进关于 SO 的许多类似问题,例如 How can I read an input string of unknown length?

标签: c pointers scanf


【解决方案1】:

你的代码和你想要的有一些问题。

const char* string; 声明了一个指向 char 的指针。你可以改变位置 你的指针指向的地方,你不能改变内存的内容 指针所指向的。

const char *string = "Hello";
char line[] = "a b c";

string = "World"; // legal
string[0] = 'w';  // illegal

string = line;    // legal
string[0] = 'A';  // illegal

因此使用const char* 来读取scanf & Co 的输入是没有意义的。

当我更改为 char *info 而不是 const char 时,我收到错误:

您的意思是从char *info 更改为const char?更糟糕的是, info 只能容纳一个字符

请不要忽略编译器警告,也不要让它们静音。编译器 告诉你

警告:变量“信息”在此处使用时未初始化


你也在做

const char *info;
...
sscanf(line, "%s", info);

让我们暂时忘记const,假设它不存在。 info 是一个未初始化的指针,这意味着它不指向任何地方 特定。将其传递给 sscanf 会产生未定义的行为,因为 sscanf 正在尝试写入您可能有权访问或无权访问的内存位置 到。

如何解决:

char info[100];
...
sscanf(line, "%s", info);

info 现在是 char 的数组,可以容纳最大长度为 99 的字符串 字符。

请注意,有一个 const 指针,您要在其中保存来自用户的输入, 没有意义,它不能在设计上保持不变,因为用户输入 修改它。

反之亦然:使用const char* 非成本char*,当您需要调用以const char* 作为参数的函数时很有用:

#include <stdio.h>

void foo(const char *txt)
{
    if(txt == NULL)
        return;

    printf("The text passed is: \"%s\"\n", txt);
}

int main(void)
{
    char line[] = "Hello world";
    foo(line);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2015-10-05
    • 2020-08-01
    • 2010-10-05
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多