2011-01-14 80 views
1

我有一個變量'jmp_code',聲明爲char *。當我運行以下命令不同的結果使用%c和循環與printf中的循環與%s以空值終止的字符串

printf("char by char, the code is '%c%c%c%c'\n", *jmp_code, *(jmp_code+1), *(jmp_code+2),*(jmp_code+3)); 
printf("printing the string, the code is '%s'\n", jmp_code); 

我得到下面的結果

char by char, the code is '0,0,0, ,' 
printing the string, the code is 'ö\├w≡F┴w' 

我使用的代碼塊。這裏是我玩的示例代碼。

#include <stdio.h> 
#include <string.h> 

char * some_func(char * code); 

char * some_func(char * code) { 

    char char_array[4]; 

    strcpy(char_array, "000"); 

    code = char_array; 

    return code; 

} 
int main (void) { 

    char * jmp_code = NULL; 

    jmp_code = some_func(jmp_code); 

    printf("char by char, the code is '%c,%c,%c,%c,'\n", *jmp_code, *(jmp_code+1), *(jmp_code+2),*(jmp_code+3)); 
    printf("printing the string, the code is '%s'\n", jmp_code); 

    return 0; 

} 

我對此很困惑。任何幫助,將不勝感激。

感謝

+0

我認爲這與jmp_code的內容有關。 'α'不是ASCII字符。 – wong2 2011-01-14 14:38:54

+0

你的環境是什麼?你能粘貼完整的代碼嗎? – 2011-01-14 14:45:08

+0

令人驚歎。 char_array在some_func()函數的堆棧上,您提供它並返回指針。據我所知,printf可以打印所有的東西。 嘗試在%c%c%c之前打印%s,您可能會有第二次打印的奇怪行爲... – 2011-01-14 15:29:31

回答

1

我覺得字符類型不能使用非ASCII字符代碼。這意味着您的字符串包含UTF-8或類似符號,代碼可能位於(0,over9000)範圍內,而char代碼可能位於(0,255)範圍內。

2

這可能是有趣的,看看:

const char *pos = jmp_code; 
while (*pos) 
    printf("%d ", *pos++); 
+0

導致無限循環。我添加了以下內容 printf(「按編號分類,代碼爲'%d,%d,%d,%d,'\ n」,* pos,*(pos + 1),*(pos + 2 ),*(POS + 3)); 其中導致 數字的數字,代碼是'-108,92,-61,119,' – Justin 2011-01-14 15:28:48

2

你返回到一個臨時數組的引用。當some_func() retuns時,char_array消失,但您繼續使用它的地址。您需要使用malloc()分配一個數組,然後在使用它之後使用free()

4

一些快速意見:

char * some_func(char * code) { 
    char char_array[4]; 
    strcpy(char_array, "000"); 
    code = char_array; 
    return code; 
} 

您不能分配在C使用=字符串弄​​亂的東西了 - 你要指定代碼的您本地分配char_array代碼指針,但你不復制內存的內容。另請注意,由於char_array在堆棧上(通常)被分配,因此當您從該函數返回時,您會發現它會消失。你可以用static關鍵字解決這個問題,但我認爲這不是最好的解決方案。您應該使用的線沿線的東西(大警告這個例子中,沒有大量的安全,你需要檢查字符串的長度,但爲了簡潔的緣故):

void some_func(char * code) { 
    strcpy(code, "000"); 
    return; 
} 

(參見this(和this )爲安全的字符串處理建議)。

並通過主要的some_func(jmp_code)進行調用。如果你不確定這是什麼,請閱讀pointers

第二個問題。

char * jmp_code = NULL; 

當前,您已經爲指向char類型的指針聲明瞭足夠的空間。如果您想使用我的建議,則需要使用malloc()free()或者另外聲明char jmp_code[4],以便分配空間。

我在想什麼?好了,我的系統上,我得到:

,代碼爲「0,0,0 ,,」和代碼 是「」

但我認爲這是機會,jmp_code指向您的some_func函數提供的堆棧中的零。我想在你的系統上數據已被覆蓋。

相反,您正在閱讀您的終端解釋爲所述字符的信息。閱讀字符編碼。我特別推薦從The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

2

您正在從無效指針打印。 char_array在some_func()函數的堆棧中。
該函數返回堆棧中的東西的指針,並且在函數返回後不會再出現!
第一個printf發現堆棧保持不變,第二個,也許,發現它充滿...垃圾!