拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 使用指标和我自己的函式反转字符串

使用指标和我自己的函式反转字符串

白鹭 - 2022-03-04 1936 0 0

我有一个作业,我是 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;
}

uj5u.com热心网友回复:

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

char *s;

所以呼叫gets不安全的函式(C标准不支持该函式)

gets(s);

呼叫未定义的行为。

相反,您可以撰写 main 例如

char s[100];

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

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

至于函式,请考虑反转字符串并不意味着以相反的顺序输出字符串。这意味着改变字符串本身。

该函式应按以下方式宣告和定义

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;
}

在 main 函式中呼叫如下

puts( reversed_string( s ) );

这是一个演示程序。

#include <stdio.h>
#include <string.h>

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;
}

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 ) );
}

如果您可能不使用标准字符串函式,strlen那么该函式reversed_string可以如下所示

char * reversed_string( char *s )
{
    if ( *s )
    {
        char *last = s;

        while ( *last )   last;

        for (char *first = s; first < --last;   first)
        {
            char c = *first;
            *first = *last;
            *last = c;
        }
    }

    return s;
}

uj5u.com热心网友回复:

  1. 您在字符串范围之外阅读。
  2. 使用正确的尺寸型别 ( size_t)
  3. 命名函式不混淆方式。您的函式是以相反的顺序打印字符串,而不是反转字符串。
  4. 您使用未初始化的指标
  5. 不使用 gets
void print_reversed(const char *str, size_t nr)
{
    if(str && *str)
        do{
            putchar(*(str   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));
}

uj5u.com热心网友回复:

我想在上面提到的很好的答案中再添加一点关于性能
来自莫斯科的@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 ) );
}
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *