我使用sscanf扫描字符串并将其添加到结构中。唯一的问题是我无法打印出字符串,因为默认情况下没有添加空终止符。我尝试使用strcat()函数在那里添加一个null但是实现了这个无法工作。谢谢你的帮助。
struct a
{
int *ref;
char string[50];
}rec;
void task()
{
char *p_test;
char test[50] = "9999:STRING OF TEXT";
p_test = test;
sscanf(p_test, "%d:%[^\n]", &rec.ref, rec.string);
printf("String is:%s", &rec.string);
}
答案 0 :(得分:3)
您的代码存在多个问题。
test[50] = "9999:STRING OF TEXT";
这有两个原因是错误的。
A)test
是char
的数组,而不是char*
的数组。因此,当您为元素分配字符串(char*
)时,地址将转换为char
。
B)数组中不存在元素50
,写入它会调用未定义的行为。您有一组50
元素,其索引为0...49
。
要为数组指定初始值,您只需要:
char test[50] = "9999:STRING OF TEXT";
由于test
不需要修改......
const char *test = "9999:STRING OF TEXT";
如果要将数组归零,最简单的方法是:
char test[50] = {0};
当然,如果您正确分配字符串,则不需要,这不是您的问题。
string
结构的a
成员是char
,而不是char*
(字符串),并使用%s
格式打印时的说明符调用未定义的行为。
main
定义为返回int
,而不是void
。
sscanf
需要填写数据的指针。rec.ref
是int
,您需要传递其地址,即&rec.ref
。
您需要为rec.string
分配存储空间。
这是一个有效的例子:
#include <stdio.h>
#define STRING_LEN 50
struct a
{
int ref;
char string[STRING_LEN];
} rec;
int main()
{
char test[STRING_LEN] = "9999:STRING OF TEXT";
// note that, in the real world, this may
// be a buffer overflow waiting to happen
sscanf(test, "%d:%[^\n]", &rec.ref, rec.string);
printf("String is:%s, rec is:%d", rec.string, rec.ref);
return 0;
}
答案 1 :(得分:1)
你有很多问题;缺少null终结符实际上并不是其中之一。
一个问题是语法错误;这样:
char test[50]
test[50] = "9999:STRING OF TEXT";
是无效的语法。你需要:
char test[50] = "9999:STRING OF TEXT";
另一个问题是rec
没有字符串(char *
或char[]
),它只有一个字符(char
)。一个简单的方法,让你开始,是:
struct a
{
int ref;
char string[50];
} rec;
第三个问题是sscanf
的参数都必须是指针。 C是一种按值传递的语言;如果你只传入一个整数,那就不会给sscanf
任何方法来修改那个整数:
sscanf(test, "%d:%[\n]", &rec.ref, rec.string); // (once rec.string is a pointer)
第四个问题是格式说明符%[\n]
并不代表您希望它的含义。 (也许你真的想要%[^\n]
?)
其他较小的问题包括main
的返回类型(应该是int
,而不是void
)。
大多数这些问题的共同点是,如果您只是打开编译器警告,您的编译器会急切地帮助您识别它们!