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

c:在sscanf中将const char*读入变量?,c,pointers,scanf,C,Pointers,Scanf,我试图将字符串/*char扫描到变量中并将其传递到函数中,但得到的错误格式指定了类型“char*”,但参数的类型为“const char*”。我需要*info作为常量字符,但是如果我改变它,我会得到其他错误 如何将常量字符*信息正确扫描到sscanf中 插入:insertblk*块,常量字符*信息 当我改为char*info而不是const char时,我得到错误: warning: variable 'info' is uninitialized when used here sscanf(l

我试图将字符串/*char扫描到变量中并将其传递到函数中,但得到的错误格式指定了类型“char*”,但参数的类型为“const char*”。我需要*info作为常量字符,但是如果我改变它,我会得到其他错误

如何将常量字符*信息正确扫描到sscanf中

插入:insertblk*块,常量字符*信息

当我改为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

您的代码和所需内容存在一些问题

常量字符*字符串;声明指向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);
让我们暂时忘记常量,让我们假装它不在那里。 info是一个未初始化的指针,这意味着它不指向任何地方 特指的将其传递给sscanf会产生未定义的行为,因为sscanf 正在尝试写入一个内存位置,您可以访问该位置,也可以不访问该位置 对

如何修复它:

char info[100];
...
sscanf(line, "%s", info);
info现在是一个字符数组,可以容纳最大长度为99的字符串 人物

请注意,在要保存用户输入的位置有一个常量指针, 没有意义,它不能设计为常数,因为用户输入将 修改它

反过来做也很好:将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;
}

除了删除常量限定符以满足编译器的要求外,line和info都是未初始化的变量。他们没有指出任何具体的东西。因此,行%s,信息;将无法做任何合理的事情,这是未定义的行为。为什么需要*info作为常量字符?我需要*info作为常量字符-不,需要它是一个适当长的非常量字符数组,或指向适当大的、动态分配的非常量空间的指针。无论是否动态分配,空间的内容都不能是常量,因为您需要通过sscanf对其进行修改。可以接受为常量参数提供非常量参数,但不能反过来。问题太广泛了-这不是教程服务!您可以使用比预期的任何输入更长的固定长度数组,例如char info[1000];并用sscanfline、%999s、info限制输入;或者你可以跟进许多类似的问题,比如
#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;
}