尝试使用两个指针反转字符串

时间:2015-05-23 08:40:25

标签: c pointers

#include<conio.h>          
#include<stdio.h>    

int main(void)    
{    
    char str[20];    
    char *ptr1,*ptr2;    
    printf("Enter string\n");    
    gets(str);    
    ptr1,ptr2=&str[0];    
    while(*ptr2!='\0')                  
    {    
        ptr2++;    
    }    
    ptr2--;    
    printf("rev_string =");    
    while(ptr1!=ptr2)    //this should work for when strlen=odd integer
    {    
        int temp=*ptr2;    
        *ptr2=*ptr1;    
        *ptr1=temp;    
        ptr1++;    
        ptr2--;    
     }    
    puts(str);    
    return 0;    
} 

我的代码有什么问题?我知道当字符串的长度是偶数时,我在while循环中输入的条件不会起作用,但它应该适用于奇数情况。

1 个答案:

答案 0 :(得分:4)

似乎有一个错字

'#include<conio.h>          
^^

C标准不再支持任何功能gets。相反,您应该使用标准函数fgets

这个条件

while(ptr1!=ptr2)

对于具有偶数个字符的字符串是错误的,因为它永远不会等于false并且循环将是无限的。

以下陈述也是错误的

ptr1,ptr2=&str[0];    

这里使用了逗号运算符,ptr1未初始化。

我认为你的意思是

ptr1 = ptr2 = &str[0];    

程序可以按以下方式编写

#include<stdio.h>    

int main( void )    
{    
    char str[20];    
    char *ptr1,*ptr2;

    printf( "Enter a string: ");    
    fgets( str, sizeof( str ), stdin );

    ptr2 = str;

    while ( *ptr2 != '\0' ) ++ptr2;                  

    if ( ptr2 != str && *( ptr2 - 1 ) == '\n' ) *--ptr2 = '\0';

    printf( "rev_string = " );    

    ptr1 = str;

    if ( ptr1 != ptr2 )
    {
        for ( ; ptr1 < --ptr2; ++ptr1 )
        {    
            int temp = *ptr2;    
            *ptr2 = *ptr1;    
            *ptr1 = temp;
        }    
    }

    puts( str );

    return 0;    
}