scanf和struct的问题

时间:2014-06-08 05:19:24

标签: c scanf

我试图在结构中读取两个变量但是我在使用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。

3 个答案:

答案 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);
}