我试图反转字符串中的单词,我相信我已经编写了正确的逻辑,但是在调试时,我发现我放入new_arraychar指针变量的值正在丢失我也不知道为什么?
你能告诉我我犯了什么错,能做些什么来纠正吗?

#include <stdio.h>

void reverse_words(char *arr, int size) {
    char *ptr = arr;
    char *new_array = (char*)malloc(sizeof(char*) * size);

    while (*ptr != '\0') {
        ptr++;
    }
    ptr--;

    for (int i = size - 1; i >= 0; i--) {
        if (*ptr != ' ') {
            ptr--;
        } else {
            char *temp = ptr;
            temp++;
            //
            // Problem is in this block new_array value is lost when i increment it
            while (*temp != ' ' && *temp != '\0') {
                *new_array = *temp;
                new_array++;
                temp++;
            }
            if (i != 0) {
                *new_array = *ptr;
                ptr--;
            }
        }
    }
    *new_array = '\0';
    strcpy(arr, new_array);
    return;
}

int main() {
    char arr[] = "My job is coding";
    int size = sizeof(arr);
    reverse_words(arr, size);
    printf("%s", arr);
    return 0;
}

最佳答案

您的代码太复杂,有几个问题:
分配的内存太多:(char*)malloc(sizeof(char*) * size);分配的内存是指针大小的size倍使用malloc(size);分配size字节。
指针操作有错误,
忘记释放分配的内存,导致内存泄漏。
不需要传递数组的大小,字符串的长度是通过扫描空终止符来计算的,只需为空终止符分配一个额外的字节。
另一种解决方案是在不分配内存的情况下将字符串中的单词反转:
对每个词,把这个词倒转
最后一步:反转字符串
下面是使用实用函数的代码:

#include <stdio.h>

void reverse_mem(char *str, int size) {
    for (int i = 0, j = size; i < --j; i++) {
        char c = str[i];
        str[i] = str[j];
        str[j] = c;
    }
}

void reverse_words(char *arr) {
     for (int i = 0, j = 0;; i = j) {
        for (; str[i] == ' '; i++)
            continue;
        if (str[i] == '\0')
            break;
        for (j = i; str[j] != '\0' && str[j] != ' '; j++)
            continue;
        reverse_mem(str + i, j - i);
    }
    reverse_mem(str, size);
}

int main(void) {
    char arr[] = "My job is coding";
    reverse_words(arr);
    printf("%s\n", arr);
    return 0;
}

09-04 17:00
查看更多