c:将const char *读入sscanf中的变量?

时间:2018-01-23 17:37:30

标签: c pointers scanf

我试图将字符串/ * 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

1 个答案:

答案 0 :(得分: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只能包含一个字符

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

  

警告:变量'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;
}