c - 将源字符串反转为目标字符串

标签 c

我正在尝试反转字符串并将反转的字符串写入目标。我必须使用相同的基本结构,并且无法弄清楚我的反向函数出了什么问题。

void reverse(const char source[], char destination[]) {

if(source = 0){
    return;
}
else
{
    reverse(source+1, destination);
    destination[strlen(source)-1]=source;
}

}

void testingReverse() {
    const char *sources[] = {
    "Welcome to CMPSC 311!",
    "abcdef",
    "_ ab  cd  ef *"
};
    const char *expected[] = {
    "!113 CSPMC ot emocleW",
    "fedcba",
    "* fe  dc  ba _"
};
    char destination[50];
    int i;
    for (i = 0; i < 3; i++) {
        printf("source: \"%s\"\n", sources[i]);
        memset(destination, 'x', 49);
        destination[49] = 0;
        reverse(sources[i], destination);
        printf("destination: \"%.49s\"\n", destination);
        if (strcmp(destination, expected[i]) == 0) {
            printf("----pass----\n");
        }
        else {
            printf("----fail----\n");
        }
    }
}

以下是我现在得到的结果。

Testing reverse:

source: "Welcome to CMPSC 311!"

Segmentation fault: 11

最佳答案

您可能过于复杂地反转字符串。您需要知道的只是源字符串的长度(并且它将适合目标),然后在最基本的形式中,您可以使用索引通过简单的 for 循环将源反转为目标,例如

void reverse (char *dst, const char *src)
{
    size_t i, j = strlen(src);

    for (i = 0; src[i]; i++)        /* loop over each char in src */
        dst[i] = src[--j];          /*  decrement j, reverse copy to dst */

    dst[i] = src[i];                /* nul-terminate dst */
}

(注意:srcdst 参数的顺序已切换,以与其他字符串函数(例如 strcpy)保持一致 等..)

现在这还远未完成。您想要/需要额外的验证以确保您的参数有效并且反转的源字符串适合提供的目标缓冲区。添加验证,您可以执行类似以下操作以使事情更加稳健,例如

#define MAXC 1024

void reverse (char *dst, const char *src)
{
    size_t i, j;

    /* validate src and dest not NULL */
    if (src == NULL || dst == NULL) {
        fputs ("error: NULL paraemter passed.\n", stderr);
        return;
    }

    j = strlen(src);                /* get index of last char in src */

    if (j >= MAXC) { /* validate reversed src fits in dst */
        fputs ("error: src exceeds MAXC - 1.\n", stderr);
        *dst = 0;   /* set dst to empty-string */
        return;
    }

    for (i = 0; src[i]; i++)        /* loop over each char in src */
        dst[i] = src[--j];          /* decrement j, reverse copy to dst */

    dst[i] = src[i];                /* nul-terminate dst */
}

添加所需的#include 文件和一个简短的示例程序,该程序将反转作为程序第一个参数提供的字符串(或反转“欢迎来到 CMPSC 311!” 默认情况下,如果没有提供参数),你可以这样做:

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

#define MAXC 1024
...
int main (int argc, char **argv)
{
    char *s = argc > 1 ? argv[1] : "Welcome to CMPSC 311!",
        rev[MAXC];

    reverse (rev, s);

    printf ("original: %s\nreversed: %s\n", s, rev);
}

示例使用/输出

$ ./bin/reverse
original: Welcome to CMPSC 311!
reversed: !113 CSPMC ot emocleW

或者,传递一个字符串作为程序的输入:

$ ./bin/reverse "My dog has fleas and my cat has none."
original: My dog has fleas and my cat has none.
reversed: .enon sah tac ym dna saelf sah god yM

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 将源字符串反转为目标字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54338248/

相关文章:

c++ - 将矩阵应用于图像,寻求性能改进

c++ - 如何使用 CLR 创建一个混合了 C 和 C++ 的 Visual Studio 项目?

c - 如何在没有 rand() 函数的情况下生成随机数?

c - 如何在eclipse中使用不同的 'C'项目运行客户端-服务器套接字程序?

c - 不将字符串从文件复制到链接列表参数

c - GDB:调试关闭的代码

c - 为什么这种数据类型表现得很奇怪?

python - 将 GSL(或其他库)静态链接到共享库

c++ - 如何从子进程向所有进程发送信号?

c++ - Visual C++ 2012 中的正弦计算不一致?