輸入字符串(如"windows"),輸出反序字符串("swodniw")。要求:不使用strlen計算長度。
字符串在內存中以\0結尾。反序本質是首尾字符交換,直到中間相遇。
#include
#include
void reverse_str(char *str) {
int len = strlen(str);
for (int i = 0, j = len - 1; i < j; i++, j--) {
char tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
int main() {
char s[200];
scanf("%s", s);
reverse_str(s);
printf("%s\n", s);
return 0;
}
int len = 0;
while (str[len] != '\0') len++; // 或簡寫 while(str[len++]); len--;
int len;
for (len = 0; str[len]; len++);
char *p = str;
while (*p++) ; // p 指向 \0 後一位
int len = p - str - 1;
void reverse_recursive(char *str) {
if (*str) {
reverse_recursive(str + 1);
putchar(*str);
}
}
int main() {
char s[200];
scanf("%s", s);
reverse_recursive(s);
putchar('\n');
return 0;
}
原理:遞歸到達字符串末尾(\0)返回,回溯過程中依次打印字符,實現反序輸出。注意:此法不修改原字符串,僅反序輸出;長字符串可能棧溢出。
strrev (非標準,MSVC扩展)#include
strrev(str); // 原地反轉,返回str指針
// GCC/Clang 不支持,需自行實現
#include
#include
// 1. 雙指針 + 手動計算長度
void reverse1(char *s) {
int len = 0;
while (s[len]) len++;
for (int i = 0, j = len - 1; i < j; i++, j--) {
char t = s[i]; s[i] = s[j]; s[j] = t;
}
}
// 2. 指針版 (無索引變量)
void reverse2(char *s) {
char *p = s;
while (*p) p++; // p 指向 \0
p--; // 指向最後一個有效字符
while (s < p) {
char t = *s; *s++ = *p; *p-- = t;
}
}
// 3. 遞歸輸出 (不修改原串)
void reverse_print(const char *s) {
if (*s) {
reverse_print(s + 1);
putchar(*s);
}
}
int main() {
char str[200];
printf("輸入字符串: ");
scanf("%199s", str); // 防溢出
printf("方法1結果: ");
reverse1(str);
puts(str);
scanf("%199s", str);
printf("方法2結果: ");
reverse2(str);
puts(str);
scanf("%199s", str);
printf("方法3輸出: ");
reverse_print(str);
putchar('\n');
return 0;
}
\0是計算長度、遍歷的核心依據字符串反序是指針操作、循環控制、遞歸思維的經典綜合練習。建議熟練掌握雙指針原地反轉法,理解遞歸版本的優雅與局限。