帮助在C中反转字符串

我试图在C中反转字符串

这就是我所拥有的

void reverse(char str[]) { int i = 0; int length; // Get string length for (i = 0; str[i] != '\0' ; ++i) { length = i; } char reversed[1000]; int j; j = 0; // Reverse it for (j = 0; j < length ; ++j) { reversed[j] = str[length - j]; } } 

我知道reversed包含reversed的字符串,但我不知道如何修改原始str而不丢弃我需要的数据。

我也不知道如何在没有循环的情况下将str设置为reversed

做另一个是否可以接受……

  int m; m = 0; for (m = 0; m < length ; ++m) { str[j] = reversed[j]; } 

通常我会说这很多循环闻起来,但我还是对语言还不太熟悉所以我不确定……

更新

感谢所有答案的人,我也很感谢编辑!

我结束了这个 ……

 int main() { char str[] = "Reverse me!"; int length; for (length = 0; str[length] != '\0'; length++) { } printf("length => %d chars\n", length); int j, k; char c; for (j = 0, k = length - 1; j  %s\n", str); return 0; } 

我现在知道的一些事情……

  • PHP中有一个strlen() 。 但是,它还没有在书中讨论过,而且我需要熟悉空终止字符串。
  • for循环可以分配和执行以逗号分隔的多个内容。 我从来不知道这个!

所以问是值得的:)

对您的代码的评论:

 void reverse(char str[]) { int i = 0; int length; // Get string length for (i = 0; str[i] != '\0' ; ++i) { length = i; } 

而不是每次你可以等到结束时将i复制到长度。

 size_t len = 0; // size_t is an unsigned integer that is large enough to hold the sizes // of the biggest things you can have (32 bits on 32 bit computer, // 64 bits on a 64 bit computer) char * s = str; while (*s) { len++; s++; } 

虽然编译器可能能够为您进行此优化。

但是,你应该知道有一个标准的字符串函数strlen#include ),它将使用相同的通用算​​法测量char字符串的长度(查找结尾),但通常针对目标进行优化处理器。

 len = strlen(str); 

您的代码:

  char reversed[1000]; 

使用大数组有助于学习和简单的示例,但您也可以根据您现在知道的需要动态分配内存。 执行此操作的标准函数是malloc ,它位于stdlib.h (也在malloc.h )。 但是,也应该释放使用此函数分配的内存。

 int * p = malloc( 8 * sizeof(int) ); // allocate an array of 8 ints /* ... work on p ... */ free(p); /* ... don't access the memory pointed to by p anymore ... */ p = 0; 

malloc系列中还有其他function。 有calloc ,它分配内存并清除它将它设置为0.还有一个名为strdup的函数(它不在标准C中,但在string.h中非常广泛),它接受一个字符串并分配它的副本。 它真的只是:

 char * strdup(const char * str) { size_t len = strlen(str); char * s = malloc(len+1); if (!s) { return s; } return strcpy(s,str); // This could have been memcpy since you know the size // and memcpy might have been faster on many processors } 

另一个有用的内存分配函数是alloca (不是在C标准中,但是C99中可变长度数组可以使用广泛可用且类似的function)。 这很棒,但与malloc不同。 它分配的内存仅在当前函数返回之前可用,因为此内存的分配方式与本地变量的内存(来自堆栈)相同。

更多代码:

  int j; j = 0; // Reverse it for (j = 0; j < length ; ++j) { reversed[j] = str[length - j]; } 

代码:

 void reverse_in_place(char * str, size_t len) { size_t i, j; for (i = 0, j = len - 1; i < j ; i++, j--) { char a = str[i]; char z = str[j]; str[i] = z; str[j] = a; } } 

应该交换字符串的顺序而不复制它。 对于奇数长度的字符串,它不会尝试将中间字符与自身交换。

你想做一个就地逆转。 这是一个标准算法:

 // taken from The C Programming Language // by Brian Kernighan and Dennis Ritchie (K&R) void reverse(char s[]) { int c, i, j; for (i = 0, j = strlen(s)-1; i < j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } 

请注意, strlen几乎取代了原来的第一个循环。 它是string.h许多标准字符串操作例程之一。

也可以看看

  • 维基百科/就地算法
  • 维基百科/ string.h
  • 维基百科/ C标准库

您可以使用以下两种方法中的任何一种,具体取决于您是否对指针感到满意。 当你学习指针时,也可以并排查看它们,这样你就可以更好地理解它们如何相互映射。

这是一个用于测试目的的完整程序:

 #include  #include  // The pointer version. void reverse1 (char *str) { char t; // Temporary char for swapping. char *s = str; // First character of string. char *e = &(s[strlen(s)-1]); // Last character of string. // Swap first and last character the move both pointers // towards each other. Stop when they meet or cross. while (s < e) { t = *s; *s++ = *e; *e-- = t; } } // The array version. void reverse2 (char *str) { char t; // Temporary char for swapping. int s = 0; // First character of string. int e = strlen(str)-1; // Last character of string. // Swap first and last character the move both pointers // towards each other. Stop when they meet or cross. while (s < e) { t = str[s]; str[s++] = str[e]; str[e--] = t; } } 

 int main (void) { char x[] = "This is a string for reversing."; printf ("Original: [%s]\n", x); reverse1 (x); printf ("Reversed: [%s]\n", x); reverse2 (x); printf (" Again: [%s]\n", x); return 0; } 

输出是:

 Original: [This is a string for reversing.] Reversed: [.gnisrever rof gnirts a si sihT] Again: [This is a string for reversing.] 

使用指针反转C中的字符串

 #include char *srcptr = "Hello!"; char *destptr; unsigned int length = 0; void main(void) { while(*(ptr++) != '\0') { length++; } //at the end of while loop, pointer points to end of string while(length--) { *destptr++ = *ptr--; } //append null at the end *destptr = '\0'; printf("%s",ptr); }