Инвертировать строку в C

Я пытаюсь написать код, где я ввожу строку, и я получаю его в перевернутом виде. То есть: от "нокиа" до "айкон".

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

Все, что я получаю из своего printf, это "?".

Вот код:

void main(void)
{
    char palavra[10];
    char palavra2[10];
    int i;
    int k;

    printf("Introduza uma string: \n");
    scanf("%[^\n]", palavra);

    for( i = 0, k = strlen(palavra) - 1 ; i <= k; i++, k--)
    {
        palavra2[k] = palavra[i];
    }
    printf("\nString invertida: %s", palavra2);
}

4 ответа

Решение

Попробуйте эту простую обратную функцию:

/* reverse:  reverse string s in place */
void reverse(char s[])
{
    int c, i, j;

    for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

Чтобы интегрировать его в свой код:

void main(void)
{
    char palavra[10];
    int c, i, j;

    /* read the string */
    printf("Introduza uma string: \n");
    scanf("%[^\n]", palavra);

    /* null-terminate the string */
    palavra[strlen(palavra)] = '\0';

    /* reverse the string */
    for (i = 0, j = strlen(palavra)-1; i < j; i++, j--) {
        c = palavra[i];
        palavra[i] = palavra[j];
        palavra[j] = c;
    }

    printf("\nString invertida: %s", palavra);
}

Ваши индексы цикла работают противоположным образом, поэтому они встречаются в середине, и цикл останавливается, когда i <= k: половина строки не инвертирована. Просто проверить i против strlen(palavra)

Кроме того, вы должны завершить строку ноль:

int len=strlen(palavra);
for( i = 0, k = len - 1 ; i < len; i++, k--)
{
    palavra2[k] = palavra[i];
}
palavra2[len]='\0';

(и вам лучше сохранить значение strlen(palavra) так что вычислять нужно только один раз)

Приведенный выше ответ довольно хорош, я просто улучшаю код, оптимизируя его с помощью битовой операции.

#include<stdio.h>
int main(void)

{
    char palavra[10];

    printf("Introduza uma string: \n");
    scanf("%[^\n]", palavra);

    char *start=palavra;
    int len = strlen(palavra);
    char *end = (palavra+len-1);

    while(start < end )
    {
            *start = *start ^ *end;
            *end = *end ^ *start;
            *start = *end ^ *start;
            start++;
            end--;

    }


printf("\nString invertida: %s\n", palavra);

return 0;
}

Хорошо использовать побитовый оператор и сократить количество итераций наполовину, поменять местами

Вы можете использовать рекурсивную функцию. Я использую строковый класс (специфичный для C++), вы можете изменить его на char*.

void reverse(string& str, int i, int len)
{
    if(i<len)
        reverse(str, i+1, len-1);
    swap(str[i], str[len]);
}

Звонящий - reverse(str, 0, str.length()-1)

Другие вопросы по тегам