我刚刚编写了一个程序,无论用户提供什么,都会反转一个句子。例如:如果用户输入“你好吗”,我的程序会生成“uoy era woH”。
我写的程序如下所示。我只是有一个疯狂的直觉,可以有一个比这更聪明的程序。非常感谢您提供的宝贵意见,或者也欢迎任何更好的计划。
int ReverseString(char *);
main() {
char *Str;
printf("enter any string\n");
gets(Str);
ReverseString(Str);
getch();
}
int ReverseString(char *rev) {
int len = 0;
char p;
while(*rev!='\0') {
len++;
rev++;
}
rev--;
while(len>0) {
p = *rev;
putchar(p);
rev--;
len--;
}
}
非常感谢。
答案 0 :(得分:7)
你可以使用递归。
int ReverseString(char *rev) {
if(*rev!='\0') {
ReverseString(rev + 1);
putchar(*rev);
}
return 1;
}
答案 1 :(得分:3)
void ReverseString( char* str, int len ) {
if( len > 1 ) {
swap( &str[0], &str[len - 1] );
ReverseString( ++str, len - 2 );
}
}
或者,展开尾递归:
void ReverseString( char* str, int len ) {
while( len > 1 ) {
swap( &str[0], &str[len - 1] );
++str;
len -= 2;
}
}
其中swap定义为:
void swap( char* a, char* b ) {
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
如果你使用这个,你的TA肯定会知道你自己没有想到这一点:)
答案 2 :(得分:0)
这不起作用。应该为你的句子分配记忆。
char *Str;
printf("enter any string\n");
gets(Str);
应该是:
char str[81]={0};
printf("Enter any string up to 80 characters\n");
scanf("%80s\n",str);
ReverseString(str)
此外,你应该避免获取功能。它会导致buffer overflows
答案 3 :(得分:0)
好的,这是我的功能。我刚才写的,只是为了练习。
char* reverse(char *string){
int length = 0;
int half = 0;
length = strlen(string);
half = (length/2) - 1;
--length;
int i = 0;
register char interim;
for(; i<=half; ++i){
interim = string[i];
string[i] = string[length - i];
string[length - i] = interim;
}
return string;
}
现在我看着它,我为它感到骄傲,而不是在我开始工作的时候。我只是张贴它,因为当我找到它时,我要求我发布它 - 并且为了完整性。
在查看其他一些答案之后,我意识到计算一半字符串是不必要的,我可以简化length
,直到i
和length
相等。哦,好吧 - 在这里。
此外,请不要抨击我使用register
关键字:P
答案 4 :(得分:0)
如果您不知道字符串的长度:
void reverse_string(char* str) {
char* p2 = str;
while (*p2 != '\0') {
/* assumes the string is null-terminated, will fail otherwise */
++p2;
}
--p2;
char* p1 = str;
while (p1 < p2) {
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
++p1;
--p2;
}
}
如果你这样做:
void reverse_string(char* str, const size_t len) {
if (len <= 1) {
return;
}
char* p2 = str + len - 1;
char* p1 = str;
while (p1 < p2) {
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
++p1;
--p2;
}
}
答案 5 :(得分:0)
以下程序以反向字符顺序打印其参数:
#include <string.h>
#include <stdio.h>
char * reverse(char * string) {
char * a = string;
char * b = string + strlen(string) - 1;
for(; a < b; ++a, --b)
*a ^= *b, *b ^= *a, *a ^= *b; // swap *a <-> *b
return string;
}
int main(int argc, char * argv[]) {
for(int i = 1; i < argc; ++i)
puts(reverse(argv[i]));
}
此处没有新内容,但IMO比大多数其他答案更具可读性。
答案 6 :(得分:0)
void revstr(TCHAR *str) {
if( *str == '\0' ) {
return;
}
TCHAR *start = str;
TCHAR *end = start + strlen(str) - 1;
while(start < end) {
*start ^= *end;
*end ^= *start;
*start ^= *end;
*start++;
*end-–;
/*
could also use *start ^= *end ^= *start++ ^= *end–-; if you want to get fancy
*/
}
}
从2005 version of myself被盗,但是那个家伙,他和我的妻子睡了。是的,我知道我不需要一些'*',但我先写了一个单行,然后转换它,而单行则需要它们。
答案 7 :(得分:0)
另一种变化......
void ReverseString( char *str, int len ) {
int i;
for(i=0; i < len/2; i++) {
swap( &str[i], &str[len -1 -i] );
}
}
void swap( char *a, char *b ) {
char tmp = *a;
*a = *b;
*b = tmp;
}
答案 8 :(得分:-1)
#include<stdio.h>
void reverse(char s[])
{
int i=0,j,x=0,z;
printf("\nThe string is : ");
printf("%s",s);
printf("\nThe reverse string is : ");
while(s[i] != ' ')
{
while(s[i] != ' ')
i++;
z=i+1;
for(j=i-1;j>=x;j--)
printf("%c",s[j]);
printf(" ");
i=z;
x=z;
}
}
main()
{
char s[50];
int a;
for(a=0;a<50;a++)
s[a]=' ';
puts("\nEnter a sentence : ");
fgets(s,50,stdin);
reverse(s);
}