2013-05-05 54 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。然後,它工作正常。