Обратная исходная строка в место назначения - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь перевернуть строку и записать перевернутую строку в пункт назначения. Я должен использовать ту же базовую структуру и не могу понять, в чем дело с моей обратной функцией.

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

Ответы [ 3 ]

0 голосов
/ 24 января 2019

попробуйте

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

void reverse(const char *source ,  char *destination) 
{
int i=0;
int length=0;

length=strlen(source);

if(!length) return;

strcpy( destination , source);

   while(source[i])
   { 
       printf("\n%c",source[i]);
       destination[length-(1+i)]=source[i];
       printf("\n=====> %s",destination);
       i++;
   }

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

}

int main()
{
   char string[99];
   char destination[99];

    strcpy( string, "abcdefghijklmnop");
    reverse(string, destination);
    }
0 голосов
/ 24 января 2019

Возможно, вы сильно усложняете изменение строки. Все, что вам нужно знать, это длина исходной строки (и то, что она будет соответствовать месту назначения), а затем в ее основной форме вы можете преобразовать источник в dest с помощью простого цикла 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 */
}

( примечание: порядок параметров src и dst переключается в соответствии с другими строковыми функциями, такими как 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 файлы и краткий пример программы, которая обратит строку, указанную в качестве 1-го аргумента программы (или отменит "Welcome to 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

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 24 января 2019

Может быть, это вдохновит вас

void reverse(char *str) { 
    if (*str) { 
       reverse(str+1); 
       printf("%c", *str); 
    } 
} 

Вы также можете посмотреть в strrev (arr);

https://www.programmingsimplified.com/c-program-reverse-string

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...