c - strcpy(char*,char a[]) 给出了错误的输出。 (逐字反转字符串)

标签 c arrays string pointers reverse

我要实现的目标-

输入:(假定为字符串文字。)这是一个字符串

输出:string a is This

我天真的解决方案:

  1. 将字符串文字复制到字符数组。
    char 数组 str[sizeofstring] 的当前内容:This is a string

  2. 逐字反转数组,存入另一个数组。
    char reverse[sizeofstring]:sihT si a gnirts

  3. 从最后一个位置到第0个位置反向遍历数组。将其存储在字符数组解决方案中。
    char solution[sizeofstring]: string a is This

  4. strcpy(pointertoachar, solution)。 - 因为函数需要返回一个指向 char 的指针。

代码:

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

char *reverse(char *input) {
    int n = strlen(input);
    char str[n];

    char reverse[n];
    char solution[n];

    char *solutionp = malloc(sizeof(char) * n);
    strcpy(str, input);

    int last = 0;
    int i = 0;
    int q = 0;

    while (str[i] != '\0') {
        if (str[i] == ' ') {
            printf("i : %d\n", i);
            printf("LAST:%d\n", last);
            for (int t = (i - 1); t >= last; t--) { 
                reverse[q] = str[t];
                q++;
            }
            last = i + 1;
            reverse[q] = ' ';
            q++;
        }
        i++;
    }

    // for the last word.
    for (int cc = i - 1; cc >= last; cc--) {
        reverse[q] = str[cc];
        q++;
    }

    // Traversing from the last index to the first.
    int ii;
    int bb = 0;
    for (ii = n - 1; ii >= 0; ii--) {
        solution[bb] = reverse[ii];
        bb++;
    }

    // This prints the right output.
    // printf("%s\n",solution);

    // Copying from a char array to pointer pointing to a char array.
    strcpy(solutionp, solution);

    return solutionp;
}

int main() {
    char *str = "This is a string";
    char *answer;

    answer = reverse(str);
    printf("%s\n", answer);

    printf("\n");

    return 0;
}

问题:

第 1 步到第 3 步按预期工作。出于调试目的,我尝试打印包含解决方案的数组的输出并且它有效,但是当我使用 strcpy 将它复制到指针指向的 char 数组并返回指针时,它打印垃圾值以及部分正确的输出。

OUTPUT:
string a is This??Z??

第 4 步似乎有问题。我做错了什么?

最佳答案

代码中的主要问题是您分配的临时缓冲区太短了一个字节。您必须为字符串末尾的最后一个 '\0' 字节留出足够的空间。

您可以通过使用辅助函数以相反顺序复制 block 来简化代码:

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

char *reverse_block(char *dest, const char *src, int len) {
    for (int i = 0; i < len; i++) {
        dest[i] = src[len - i - 1];
    }
    dest[len] = '\0';
    return dest;
}

char *reverse_words(const char *string) {
    int i, last;
    int len = strlen(string);
    char temp[len + 1];

    for (i = last = 0; i < len; i++) {
        if (string[i] == ' ') {
            // copy the word in reverse
            reverse_block(temp + last, string + last, i - last);
            temp[i] = ' ';
            last = i + 1;
        }
    }

    // copy the last word in reverse
    reverse_block(temp + last, string + last, len - last);

    // allocate an array, reverse the temp array into it and return it.
    return reverse_block(malloc(len + 1), temp, len);
}

int main(void) {
    const char *string = "This is a string";

    printf("%s\n", string);

    char *solution = reverse_words(string);
    printf("%s\n", solution);

    free(solution);

    return 0;
}

现在您可以通过实现一个函数来进一步改进代码,该函数可以原地反转 block 。有了这个,您不再需要临时缓冲区,您可以直接处理字符串副本并简化代码。

关于c - strcpy(char*,char a[]) 给出了错误的输出。 (逐字反转字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40349768/

相关文章:

C计算字符串中大小写字母的个数

python - 创建单个列表项的列表乘以 n 次

php - PHP-从数组中获取字段并将其转换为数组

php - 在没有留下后按子串切割字符串

c - 从函数返回一个字符串数组

C++ 在文本前查找字符串

c - lseek() 尝试使用字节文件,但指针是 FILE 类型

c - 在 C 中,如果你有一个由 int 指针和 int 变量本身组成的结构,它有多少字节?

java - 如何计算 int 值中的位数?

c - scanf 函数跳过 while 循环中的值来扫描字符值