2013-05-05 22 views
0

所以我有这个小部分代码(基本上是我的整个程序的输入)。fgets没有使用sscanf正确存储的输入

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

例如,主站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; 
} 

基本上我试图把它打印出来,看看该程序是否正确存储输入,因为它被存储在一个链表以后。

一切工作正常,但无论我输入什么,它打印出(空)0 4196064.它seg错误,如果我在sscanf()函数中放置和名称infront和。

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

回答

1

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

char name[28]; 

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

+0

好吧,这很有意义。仍然试图围绕C和内存包裹我的头,但这真的澄清了它。非常感谢! – user2334829 2013-05-05 00:46:39

0

恐怕以下更改nametype,从字符指针字符array.Both是不同的:

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; 
} 

在你的代码,尽管你没有给它分配任何内存,但你已经尝试使用sscanf()来写入地址name。这将导致seg-fault,并且输出将是不可预知的。在上面的代码malloc()已用于分配适当大小的内存块并将地址分配给name。然后,它工作正常。