我试图在结构中读取两个变量但是我在使用scanf时面临一些问题。这是代码:
typedef struct {
int pc;
char* label;
} sb;
...这里是struct的实例化:
sb input;
fscanf (in, "%s%d", input.label, &(input.pc));
printf ("%s %d\n", input.label, input.pc);
我期待输出一个' c-string'和一个整数但由于某种原因它给了我:(null)和-971303966。
答案 0 :(得分:4)
主要问题是您实际上没有在标签的结构中分配任何存储空间。一种解决方案是将声明更改为:
typedef struct {
int pc;
char label[80];
} sb;
但请注意,代码现在很危险,因为它读入缓冲区而不对读取设置任何限制,因此它可以溢出缓冲区。
答案 1 :(得分:1)
"标签"在你的struct中只是一个指针,没有任何东西可以容纳一个字符串。你必须为它分配一些内存
Input.label = (char*)malloc(122);
或者将您的结构更改为
typedef struct { int pc; char label[122]; } sb;
请注意为字符串分配的内存量。最好使用fscanf_s,这样就可以声明要读取的最大长度。
答案 2 :(得分:0)
fscanf(in, "%s%d", input.label, &(input.pc))
导致未定义的行为(UB),因为input.label
尝试保存的fscanf()
没有与之关联的内存。
1)避免使用fscanf()
。建议fgets()/sscanf()
2)检查任何类似scanf()
功能的返回值
3)为label
void Read_sb(sb *data) {
sb->pc = 0;
sb->label = NULL;
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_IOErrroOrEOF();
char s[sizeof buf];
if (sscanf(buf, "%s%d", s, &sb->pc) != 2) Handle_FormatError();
sb->label = strdup(s);
}