未正确使用sscanf存储的fgets输入

时间:2013-05-05 00:28:27

标签: c fgets scanf

所以我的代码中有一小部分(基本上是整个程序的输入)。

它必须采用最多20个字符的字符串形式,并且两个整数都用空格分隔。

例如master 1 1

int main(void)
{

  int i, x, y;
  char input[28];
  char* name = NULL;
  fgets(input, 28, stdin);
  sscanf(input, "%s %i %i", name, &x, &y);
  printf("%s %i %i\n", name, x, y);
  return 0;
}

基本上我正在尝试打印它以查看程序是否正确存储输入,因为它必须稍后存储在链表中。

一切都运行正常,但不管我输入的是什么,它打印出来(null)0 4196064.如果我在sscanf()函数中放置名称和&符号名称,它会出现错误。

如何解决这个问题的任何想法都将非常感激!

2 个答案:

答案 0 :(得分:1)

sscanf不会为你的字符串分配存储空间。

char name[28];

会奏效。 & name导致seg.fault,因为间接级别不同。然后你传递的是一个char * *,在sscanf中被解释为char *。由于您的名称变量位于堆栈中,& name指向堆栈,因此sscanf将覆盖您的堆栈内容。这很容易导致seg.fault。

答案 1 :(得分:0)

我担心以下内容会更改type的{​​{1}},从字符指针到字符数组。两者都不同:

name

所以这更合适:

  char name[28];

在您的代码中,您尝试使用#include<stdio.h> #include<stdlib.h> int main(void) { int i, x, y; char input[28]; char* name = malloc(28*sizeof(char)); //No need to change type of "name" printf("Enter your stuff\n"); fgets(input, 28, stdin); sscanf(input, "%s %i %i", name, &x, &y); printf("%s %i %i\n", name, x, y); return 0; } 写入地址name,即使您尚未为其分配任何内存。这将导致seg-fault并且输出将无法预测。在上面的代码sscanf()已用于分配一个适当大小的内存块,并将地址分配给malloc()。然后它工作正常。