2012-11-18 47 views
-1

我想追加一個字符串到文本文件,但我變得奇怪的字符。 如果我嘗試將我的結果打印到控制檯,則輸出是常規的。 這就是我在vim中看到的輸出。如果我在gedit中查看它,我會得到奇怪的盒子。奇怪的輸出寫入文件在C

輸出文件:

A^CA^BB^A 
    A^CB^BA^A 
    B^CA^BA^A 

預期輸出:

AAB 
ABA 
BAA 

我的功能應該沒有重複的排列寫出到一個文本文件中。

代碼對於功能:

void RecursivePermute (char *prefix, char *rest, int *ptr) 
{ 
    char *temp = malloc(sizeof(char *)); 
    char *new_prefix = malloc(sizeof(char *)); 
    char *rest_left = malloc(sizeof(char *)); 
    char *rest_right = malloc(sizeof(char *)); 
    char *new_rest = malloc(sizeof(char *)); 
    char rest_char; 
    int idx = 0; 
    int first_occurance = 0; 
    int i; 
    FILE *file; 
    strcpy(temp, rest); 
    if (*rest == '\0') 
    { 
     *ptr += 1; 
     printf("Permutation %d: %s\n", *ptr, prefix); 
     file = fopen("permutations.txt", "a"); 
     fprintf(file,"%s\n",prefix); 
     fclose(file); 
     return; 
    } 
    else 
    { 
     size_t rest_size = strlen(rest); 
     while (*rest != '\0') 
     { 

      first_occurance = (strchr(temp, *rest) - temp - idx); 
      if (first_occurance == 0) 
      { 
       rest_char = *rest; 
       rest_left = strncpy(rest_left, rest-idx, idx); 
       rest_right = strncpy(rest_right, rest+1, rest_size-1); 
       sprintf(new_rest, "%s%s", rest_left, rest_right); 
       sprintf(new_prefix,"%s%s", prefix, &rest_char); 
       RecursivePermute(new_prefix, new_rest, ptr); 
      } 
      rest++; 
      idx ++; 
     } 
    } 
} 
+0

如果您還顯示對該函數的調用,顯示您傳遞的參數並顯示結果將會很有幫助。 – steveha

+0

@steveha我正在用RecursivePermute(「」,letters,&count)調用函數; //其中count = 0;和字母[] =「AAB」; – Miles

回答

0

的一件事是你的printf格式說明符& rest_char是錯誤的。 & rest_char不能被解釋爲一個字符串,因爲它不是空終止的。如果你想打印出一個字符使用%c。你的線應該看起來像這樣:

sprintf(new_prefix,"%s%c", prefix, rest_char); 

你也可能想看看你是如何分配字符串。通過指定sizeof(char *)的大小,它只會創建一個指針大小的內存分配。如果靜止字符串大於該值,則在執行strcpy時會導致緩衝區溢出。

+0

是的,解決了我遇到的問題。我也會試圖找出sizeof(char *)和strcpy所帶來的問題。 – Miles

+2

如果你知道你的字符串不會超過一定的長度,只需將它們聲明爲一個數組char temp [120],然後使用strncpy(temp,rest,120); –

+0

@NathanMoinvaziri,像這樣使用'strncpy'並不危險。我們必須時刻注意爲額外的空字符留出空間。一個安全的方法是使用'strncpy(temp,rest,119); temp [119] ='\ 0';'。 –

0

當您撥打malloc(sizeof(char *))時,您正在分配四個字節的緩衝區(如果您正在編譯64位,則分配八個字節)。這幾乎肯定不是你想要的。

然後,您使用strcpy()它不檢查長度。我幾乎從未使用strcpy()了。

你也使用strncpy(),它會檢查長度,但我有點討厭它,因爲它不能保證字符串將正確地以null結尾;如果複製長度爲4或更長的字符串,並且緩衝區只能保存4個字符,則不存在空值。

所以,我沒有在調試器下運行你的程序,但是當你把所有這些問題放在一起時,我並不驚訝你的程序行爲不當。

+0

他用malloc分配的內存被泄漏。此代碼只是...災難 –

+0

@stevenha感謝您的意見我非常感謝。你的權利我想我應該使用sizeof(char)來代替。我也將看看strncpy()。 At => Nik B你能否向我解釋當你說我的malloc分配被泄漏時你的意思? – Miles

+0

'sizeof(char)'是1.除非你的字符串長度爲1,否則你不需要這個。如果你所能擁有的最長的字符串是120個字符,你可以嘗試'malloc(121)'(不要忘記你需要爲每個字符分配空間加上終止的ASCII 0「空」字符)。他的分配意味着什麼泄漏了:你用'malloc()'分配內存,但是你永遠不會在內存中調用'free()'。對於這樣的玩具程序,沒關係,因爲程序結束時會返回內存。但是,當你完成mem時,習慣於調用'free()'並不是一個壞主意。 – steveha