Сторнирование строки в C с помощью указателей - PullRequest
0 голосов
/ 26 апреля 2018

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

Вот мой текущий код:

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

int main(void) {
    //Reverse2
    char *forward = "123";
    char *back = malloc(sizeof(char) * 4);
    reverse2(forward, back);

    return 0;
}

void reverse2(char *string, char *string2) {
    int counter = 0;
    char *string1 = string;
    while (*string1) {
        counter += 1;
        string1 += 1;
    }
    string1--;
    int i;
    for (i = 0; i <= counter; i++) {
        *string2 = *string1;
        string2 += 1;
        string1--;
    }
    printf("%s", string2);
}

Это ошибка, которая выдается при запуске в ideone:

Compilation error   #stdin compilation error #stdout 0s 0KB

prog.c:8:2: warning: implicit declaration of function 'reverse2' is invalid in C99 [-Wimplicit-function-declaration]
        reverse2(forward, back);
        ^
prog.c:41:6: error: conflicting types for 'reverse2'
void reverse2(char* string, char* string2){
     ^
prog.c:8:2: note: previous implicit declaration is here
        reverse2(forward, back);
        ^
1 warning and 1 error generated.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Ваша ошибка компиляции связана с тем, что вы вызываете reverse2 в main, но компилятор C не знает внутри main что reverse2 is все же , поскольку reverse2 определено после main.(Компилятор C должен иметь возможность компилировать файл .c в потоковом режиме, поэтому это означает, что все, что ему нужно для компиляции чего-либо - например, функции - должно быть определено заранее)

Если вы инвертируете порядокиз двух функций (т.е. вы ставите reverse2 перед main) или добавляете это объявление:

void reverse2(char*, char*);

перед main(), тогда эта ошибка не произойдет.

(я не проверял ваш код, поэтому я не знаю, выполняет ли он то, что вы хотите, но ваш вопрос касается ошибки компиляции: а не инвертирует ли код строку))

0 голосов
/ 26 апреля 2018

Чтобы предотвратить эти полезные предупреждения, вы должны либо объявить, либо определить функцию reverse2, прежде чем вызывать ее из main().

Кроме того, reverse2 не устанавливает нулевой терминатор в строке назначения иобратная строка вообще не печатается, так как указатель string2 был продвинут до конца обратной строки.

Если не указан прототип, следует рассмотреть вопрос о выделении пространства для обратной строки в reverse2и возвращая указатель:

Вот модифицированная версия:

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

char *reverse2(const char *src) {
    const char *p = src;
    char *dest, *q;

    while (*p) {
        p++;
    }
    dest = malloc(p - src + 1);
    if (dest != NULL) {
        q = dest;
        while (p > src) {
            *q++ = *--p;
        }
        *q = '\0';
    }
    return dest;
}

int main(void) {
    const char *forward = "123";
    char *back = reverse2(forward);
    printf("%s\n", back);
    free(back);
    return 0;
}
0 голосов
/ 26 апреля 2018

1 - prog.c: 8: 2: предупреждение: неявное объявление функции 'reverse2' недопустимо в C99 [-Wimplicit-function-объявление] reverse2 (вперед, назад);

Эта ошибкапоскольку вам нужно определить reverse2() до того, как main попытается вызвать его, просто переместите код на reverse2() перед кодом для main().

2 - вам нужно завершить нулевую строку назад в reverse2()

for (i = 0; i <= counter; i++) {
    *string2 = *string1;
    string2 += 1;
    string1--;
}
*string2 = '\0';

3 - бесполезно пытаться распечатать string2 в reverse2(), потому что он указывает на конец строки.Напечатайте back в main(), и вы увидите ожидаемые результаты.

reverse2(forward, back);
printf("%s", back);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...