0

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

它必须采用最多 20 个字符的字符串形式,两个整数之间用空格隔开。

例如大师 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() 函数中的名称前面加上和符号,它也会出现错误。

任何有关如何解决此问题的想法将不胜感激!

4

2 回答 2

1

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

char name[28];

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

于 2013-05-05T00:34:44.057 回答
0

恐怕以下将, 从字符指针更改为字符数组。两者都不同typename

  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在您的代码中,即使您没有为其分配任何内存,您也尝试写入地址sscanf()。这将导致 seg-fault 并且输出将是不可预测的。在上面的代码malloc()中已用于分配适当的大小内存块并将地址分配给name。然后它工作正常。

于 2013-05-05T02:03:49.387 回答