繁体   English   中英

使用指针和我自己的函数反转字符串

[英]Reversing a string using pointers and my own functions

我有一个任务,我是 C 的新手。 我将附上作业和我的代码。 基本上,问题是我的程序不起作用,我不知道出了什么问题。

解决以下问题:

  • 使用指针(指针算术而不是数组 [i]),但使用您自己的用户定义函数

编写一个程序来反转用户输入的字符串(字符数组)。

#include <stdio.h>
#include <conio.h>
void reversed_string(char *s,int nr)
{
    int i;
    for(i=nr; i>=0; i--)
    printf("%c",*(s+i));
}
int main()
{
    char *s;
    int nr;
    gets(s);
    nr=strlen(s);
    reversed_string(s,nr);
    return 0;
}

对于初学者来说,指针s未初始化并且具有不确定的值

char *s;

所以gets的调用是不安全的(C 标准不支持 function)

gets(s);

调用未定义的行为。

相反,您可以编写 main 例如

char s[100];

fgets( s, sizeof( s ), stdin );

s[ strcspn( s, "\n" ) ] = '\0';

至于 function 然后考虑到反转字符串并不意味着 output 以相反的顺序排列字符串。 这意味着改变字符串本身。

function 应按以下方式声明和定义

char * reversed_string( char *s )
{
    if ( *s )
    {
        for ( char *first = s, *last = s + strlen( s ); first < --last; ++first )
        {
            char c = *first;
            *first = *last;
            *last = c;
        }
    }

    return s;
}

主要 function 被称为

puts( reversed_string( s ) );
  1. 您在字符串范围之外阅读。
  2. 使用正确的尺寸类型( size_t
  3. 命名函数不混淆方式。 您的 function 正在以相反的顺序打印字符串,而不是反转字符串。
  4. 您使用未初始化的指针
  5. 不要使用gets
void print_reversed(const char *s, size_t nr)
{
    if(str && *str)
        do{
            putchar(*(s + nr -1));
        }while(nr--);
}

int main()
{
    char *s = "Hello World!";
    size_t nr;
    nr=strlen(s);
    print_reversed(s,nr);
    return 0;
}

如果要反转字符串:

char *reverseString(char *str)
{
    char *end = str, *wrk = str;
    if(str && *str)
    {
        while(*(end + 1)) end++;
        while(end > wrk)
        {
            char temp = *wrk;
            *wrk++ = *end;
            *end-- = temp;
        }
    }
    return str;
}



int main()
{
    char s[] = "Hello World!";

    printf("Reversed string: `%s`\n", reverseString(s));
}

我想在上面提到的很好的答案中再添加一点关于性能
来自莫斯科的@Vlad,因此通过使用宏进行交换使程序更高效。

注意:用于交换的按位异或运算假设 a=4 b=5。
后面是最后四位的二进制表示。
0100 ^ 0101 = 0001 -> a == 1

0001 ^ 0101 = 0100 -> b == 4

0001 ^ 0100 = 0101 -> a == 5

#define SWAP(a,b){ \
    a=a^b;\
    b=a^b;\
    a=a^b;\
}
char * reversed_string( char *s )
{
    if ( *s )
    {
        for (char *first = s, *last = s + strlen( s ); first < --last; ++first)
        {
           SWAP(*first,*last);
        }
    }

    return s;
}

int main( void )
{
    enum { N = 100 };
    char s[N];

    printf( "Enter a string: " );

    fgets( s, sizeof( s ), stdin );

    s[strcspn( s, "\n" )] = '\0';

    puts( reversed_string( s ) );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM