2012-11-06 71 views
0

可能重複的字符串:
Dynamic String Input - using scanf(「%as」)
strcmp with pointers not working in C掃描中使用指針用C

爲以下才算好碼?我不應該在某處使用malloc嗎?我能夠編譯這個,它工作,但我覺得它不應該有。

#include <stdio.h> 

int main (void) { 

    char *name; 

    printf("Whats your name? "); 
    scanf("%s", &name); 
    printf("\nyour name is %s", &name); 

    return 0; 
} 

如果我想修改名稱,會發生什麼情況?我會怎麼做呢?

編輯:我真的只是尋找最有效和最正確的方式做到這一點使用指針。我假設malloc是必要的。

+5

這是一個非常糟糕的代碼。我建議你首先了解內存分配是如何在C中工作的。你正在使用未初始化的指針。 – m0skit0

+0

1.不是重複的,我是另一張海報。類似的問題,但不一樣。 2.你有什麼建議,應該怎麼做?我意識到這是錯誤的,但我似乎無法找到一個好的解決方案。 – kyle

+1

比使用未初始化的指針更糟糕,您正在使用未初始化的指針的**地址**。即使你分配了內存並指向了'name',它在scanf()和printf()調用中仍然是錯誤的。 – WhozCraig

回答

5

name是一個指針,而&name返回變量name的地址,所以scanf是把你進入指針本身的名稱。

例如,如果您輸入ABC那麼指針將爲0x00434241(如果CPU是小端)或0x41434200(如果CPU是big-endian),其中0x41是「A」的字符代碼,0x42是「B」的字符代碼等。

您應該分配可以存儲輸入名稱的內存,然後將指針傳遞給scanf

這裏有一個例子在堆棧上分配:

#include <stdio.h> 

#define MAX_NAME_LENGTH 256 

int main (void) { 

    char name[MAX_NAME_LENGTH]; 

    printf("Whats your name? "); 
    scanf("%s", name); 
    printf("\nyour name is %s", name); 

    return 0; 
} 
+0

這原本就是我打算做的,但是會爲數組定義名稱,佔用你不需要的空間? – kyle

+0

@kyle:是的,它可以達到256字節,取決於你輸入的字符串有多長。 –

+0

@kyle:你不知道這個名字需要多少內存,所以分配很多作爲輸入緩衝區。然後,您可以只根據實際需要動態分配內存,將名稱複製到內存中,然後重新使用下一個輸入的緩衝區。 – MRAB

-1

或者您可以使用變得太,以避免在您擁有超過2個連續的輸入情況下,標準輸入緩衝區。

#include <stdio.h> 

#define LENGTH 256 

int main (void) { 

    char name[LENGTH]; 

    printf("Whats your name? "); 
    fgets(name, sizeof(name), stdin); 
    printf("\nYour name is %s", name); 

    return 0; 
} 
+0

如果我想使用指針怎麼辦?如果名稱只有10個字符的長度,其餘的空間會被浪費掉,導致效率下降? – kyle

+1

-1:從不使用'gets' - 使用'fgets'並指定緩衝區的大小 –

+0

@kyle:數組是一個指針。 – m0skit0