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