2016-02-20 106 views
-2

我想在C中反轉一個字符串,我能夠完成這一任務但並非沒有副作用,我不太明白。這裏是我的代碼扭轉一個字符串:在C中反轉字符串迭代

void reverseString(char *toReverse, char *reverse) { 
    int i = strlen(toReverse); 
    int counter = 0; 
    for (i; toReverse[counter] != '\0'; i--) { 
     reverse[i] = toReverse[counter]; 
     counter++; 
    } 
} 

int main(int argc, char *argv[]) { 
    char reverse[strlen(argv[1]) + 1]; 
    reverse[strlen(reverse)] = '\0'; 
    reverseString(argv[1], reverse); 
    printf("The reverse string is '%s'", reverse); 
} 

當給一個字符串這個正確字符串逆向還增加了一些額外的數據,例如:

鑑於串abc123字符串321cbaub◄¥u"ñç«返回

爲什麼會發生這種情況,我該如何解決?

+0

Insread的: '反向[strlen的(反向)] = '\ 0';'你需要'reverse [strlen(argv [1])] ='\ 0';' –

+0

空終止符... –

回答

1

你的代碼中有幾個問題:

  • 您爲reversed空終止在main的方式不正確,因爲您使用時strlen(reverse)reverse仍然未初始化。這是你得到垃圾輸出的主要原因,因爲空終止符沒有設置在正確的偏移量,但這是未定義的行爲,將未初始化的數組傳遞給strlen可能會產生更糟的後果。
  • 爲了一致性和簡單性,應在reverseString中設置空終止符。
  • 您應該在複製字符之前遞減i,否則您會創建向右移動一個位置的反轉字符串。
  • 您應該結束了printf格式字符串以換行符
  • main應該返回0

這裏是校正版本:

void reverseString(const char *toReverse, char *reverse) { 
    int i = strlen(toReverse); 
    int counter = 0; 
    reverse[i] = '\0'; /* set the null terminator */ 
    while (toReverse[counter] != '\0') { 
     reverse[--i] = toReverse[counter++]; 
    } 
} 

int main(int argc, char *argv[]) { 
    char reverse[strlen(argv[1]) + 1]; 
    reverseString(argv[1], reverse); 
    printf("The reverse string is '%s'\n", reverse); 
    return 0; 
} 
2

您應該在reverse字符串中給出空終止符\0以使用printf%s格式來打印正確反轉的字符串。

void reverseString(char* toReverse, char* reverse) { 
    int i = strlen(toReverse); 
    int counter = 0; 
    for (i; toReverse[counter] != '\0'; i--) { 
     reverse[i] = toReverse[counter]; 
     counter++; 
    } 
    reverse[counter] = '\0'; //add this 
} 

此外,有時爲動態分配的東西,這將是使用malloc最佳實踐:

reverse = (char*)malloc(i + 1); 

變爲這樣的事情:

void reverseString(char* toReverse, char* reverse) { 
    int i = strlen(toReverse); 
    int counter = 0; 
    reverse = (char*)malloc(i + 1); 
    for (i; toReverse[counter] != '\0'; i--) { 
     reverse[i] = toReverse[counter]; 
     counter++; 
    } 
    reverse[counter] = '\0'; //add this 
} 
+0

爲什麼在'reverseString'中使用內存分配? 'i'必須在第一次循環迭代之前遞減。 – chqrlie

0

您的字符串不是空值終止,這就是爲什麼你在倒轉的字符串後得到垃圾。

所以,你應該首先在你的reverseString中做reverse[i+1]=0;

1

我會說reverse[counter] = '\0';添加此功能它自我。 這看起來像

void reverseString(char* toReverse, char* reverse) { 
    int i = strlen(toReverse); 
    int counter = 0; 
    for (i; toReverse[counter] != '\0'; i--) 
    { 
     reverse[i] = toReverse[counter]; 
     counter++; 
    } 
    reverse[counter] = '\0'; //add this 
} 

這工程!