微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针字符串未返回预期输出

如何解决指针字符串未返回预期输出

 #include <stdio.h>
    
    void revstr(char str[])
    {
        char temp;
        int size = 0;
        while(*str != '\0'){
            size++;
            str++;
        }
        for (int i = 0; i < size/2; i++)        
        {
            temp = str[i];               
            str[i] = str[size-1-i];
            str[size-1-i] = temp;
        }
        for(int i = 0; i < size; i++)
        {
            printf("%c\n",*(str+i));
        }
    }
    int main()
    {
        char str[20];
        printf("enter a string: \n");
        scanf("%s",&str);
        revstr(str);
        return 0;
    }

为什么我的 rev 字符串不打印它正在打印出一些垃圾值的字符串的反向。 你能指出原因吗?

解决方法

在这个while循环之后

    while(*str != '\0'){
        size++;
        str++;
    }

指针 str 未指向字符串的开头。

相反,您可以编写例如

    while( str[size] != '\0'){
        size++;
    }

尽管如此,这样的函数应该只做一件事:反转字符串。由函数的调用者决定是否输出反转的字符串。

所以函数看起来像

char * revstr( char s[] )
{
    size_t n = 0;

    while ( s[n] ) ++n;

    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n - i - 1];
        s[n - i - 1] = c;
    }

    return s; 
}

主要你可以写

puts( revstr( str ) );

这是一个演示程序。

#include <stdio.h>

char * revstr( char s[] )
{
    size_t n = 0;

    while ( s[n] ) ++n;

    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n - i - 1];
        s[n - i - 1] = c;
    }

    return s; 
}

int main(void) 
{
    char s[] = "Hello";
    
    puts( s );
    puts( revstr( s ) );
    
    return 0;
}

程序输出为

Hello
olleH

当然,您可以使用标准字符串函数 strlen 代替 while 循环。

size_t n = strlen( s );

注意scanf的调用

scanf("%s",&str);

第二个参数应该是表达式 str

scanf("%s",str);
,

我会以另一种方式实现它:

char *reverse(char *str)
{
    char *wrk = str,*end = str;

    if(str && *str)
    {
        while(*(end + 1)) end++;
        while(end > wrk)
        {
            char tmp = *end;
            *end-- = *wrk;
            *wrk++ = tmp;
        }   
    }
    return str;
}
  1. 最好检查一下参数是否正确。
  2. 我会返回值。它允许您在表达式中使用反转字符串并将其用作函数参数。下面的例子:
int main(void)
{
    char s[] = "Hello world";

    printf("%s\n",reverse(s));
}

https://godbolt.org/z/fbo4nsn38

,

在您的代码中,您将指针 str 推进以计算其长度,但之后您忘记将其重置为开始。此外,您对 scanf 的调用应该传递 str,而不是它的地址。此外,如果用户输入超过 19 个字符的字符串,scanf 将写入超出 str 的末尾。试试这个:

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

void revstr(char str[])
{
    char temp;
    int size = strlen(str);
    for (int i = 0; i < size / 2; i++) {
        temp = str[i];
        str[i] = str[size - 1 - i];
        str[size - 1 - i] = temp;
    }
}

int main()
{
    char str[20];
    printf("enter a string: \n");
    fgets(str,sizeof(str),stdin);
    str[strcspn(str,"\n")] = '\0';
    revstr(str);
    printf("%s\n",str);
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。