所以我的代码中有一小部分(基本上是整个程序的输入)。
它必须采用最多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()函数中放置名称和&符号名称,它会出现错误。
如何解决这个问题的任何想法都将非常感激!
答案 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()
。然后它工作正常。