首页 > 解决方案 > 为什么我在 c 中反转字符串的函数不起作用?

问题描述

我正在编写一些 C 代码,其中用户输入所需的字符串大小,然后输入一个字符串,该字符串将被反转然后打印(而不是反向打印。)我还想提一下,我不想使用外部库,重点是能够手动完成。我使用动态内存分配来创建一个由用户输入的大小的字符串,并称为“反向数组”函数。在调用该函数之前一切正常。我反转字符串的方法遵循与反转普通数组相同的原则,但不是移动整数,而是移动字符。你能向我解释我做错了什么吗?

我的代码:

#include <stdio.h>
#include <stdlib.h>

int RvsArr(char *Str, int end)
{
    int start = 0;
    char tmp;
    while (start < end)
    {
        tmp = Str[start];
        Str[start] = Str[end];
        Str[end] = tmp;
        start++;
        end--;
    }
    printf("%s", Str);
    return 0;
}

int main()
{
    int ArrSz;
    printf("Please enter array size: ");
    scanf("%i", &ArrSz);
    char *Str;
    Str = (char *)malloc(ArrSz * sizeof(char));
    printf("Please enter your string: ");
    scanf("%s", Str);
    RvsArr(Str, ArrSz);
    free(Str);
    return 0;
}

标签: creversec-stringsfunction-definition

解决方案


您需要反转实际的字符串,而不是整个缓冲区。

char *RvsArr(char* Str)
{
    char *end, *wrk = Str;
    char tmp;
    if(wrk && *wrk)
    {
        end = Str + strlen(wrk) - 1;
        while(wrk < end)
        {
            tmp = *wrk;
            *wrk++ = *end;
            *end-- = tmp;
        }
    }
    return Str;
}

int main()
{
    int ArrSz;
    printf("Please enter array size: ");
    scanf(" %i", &ArrSz);
    char* Str;
    Str = malloc(ArrSz * sizeof(char));
    printf("Please enter your string: ");
    scanf(" %s", Str);
    printf("\n`%s`\n", RvsArr(Str));
    free(Str);
    return 0;
}

https://godbolt.org/z/azob5s


推荐阅读