Поскольку вы хотите перевернуть строку, вы сначала должны решить, хотите ли вы перевернуть копию строки или перевернуть строку на месте (на месте). Поскольку вы спросили об этом в контексте «C», предположим, что вы хотите изменить существующую строку (перевернуть существующую строку) и сделать копию строки в вызывающей функции, если вы хотите сохранить оригинал.
Вам понадобится строковая библиотека
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Индексирование массивов работает, и эта версия использует этот подход,
/* this first version uses array indexing */
char*
streverse_a(char string[])
{
int len; /*how big is your string*/
int ndx; /*because 'i' is hard to search for*/
char tmp; /*hold character to swap*/
if(!string) return(string); /*avoid NULL*/
if( (len=strlen(string)) < 2 ) return(string); /*one and done*/
for( ndx=0; ndx<len/2; ndx++ ) {
tmp=string[ndx];
string[ndx]=string[len-1-ndx];
string[len-1-ndx]=tmp;
}
return(string);
}
Но вы можете сделать то же самое с указателями,
/* this is how K&R would write the function with pointers */
char*
streverse(char* sp)
{
int len, ndx; /*how big is your string */
char tmp, *bp, *ep; /*pointers to begin/end, swap temporary*/
if(!sp) return(sp); /*avoid NULL*/
if( (len=strlen(bp=sp)) < 2 ) return(sp); /*one and done*/
for( ep=bp+len-1; bp<ep; bp++, ep-- ) {
tmp=*bp; *bp=*ep; *ep=tmp; /*swap*/
}
return(sp);
}
(Нет, действительно, компилятор не взимает меньше за возврат void.)
И поскольку вы всегда тестируете свой код,
char s[][100] = {
"", "A", "AB", "ABC", "ABCD", "ABCDE",
"hello, world", "goodbye, cruel world", "pwnz0r3d", "enough"
};
int
main()
{
/* suppose your string is declared as 'a' */
char a[100];
strcpy(a,"reverse string");
/*make a copy of 'a', declared the same as a[]*/
char b[100];
strcpy(b,a);
streverse_a(b);
printf("a:%s, r:%s\n",a,b);
/*duplicate 'a'*/
char *rp = strdup(a);
streverse(rp);
printf("a:%s, r:%s\n",a,rp);
free(rp);
int ndx;
for( ndx=0; ndx<10; ++ndx ) {
/*make a copy of 's', declared the same as s[]*/
char b[100];
strcpy(b,s[ndx]);
streverse_a(b);
printf("s:%s, r:%s\n",s[ndx],b);
/*duplicate 's'*/
char *rp = strdup(s[ndx]);
streverse(rp);
printf("s:%s, r:%s\n",s[ndx],rp);
free(rp);
}
}
person
ChuckCottrill
schedule
21.11.2015
char string[]
для аргументов, поскольку он делает неочевидным, чтоstring
на самом деле является указателем. (Изменить: я имею в виду человека, читающего или пишущего код; компьютеру все равно) - person user253751   schedule 21.11.2015char* string
. Следующий вопрос: знаете ли вы, почемуvoid f(int x) {x = 7;} int main() {int y = 5; f(y); printf("%d\n", y); return 0;}
печатает 5, а не 7? - person user253751   schedule 21.11.2015std::reverse(string.begin(),string.end())
. - person Eric Angle   schedule 21.11.2015