2016-12-05 18 views
3

Im пытается написать код, в который я ввожу строку, и я получаю ее инвертированной. I.e .: «Nokia» на «Айкон».Инвертировать строку в C

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

Все, что я получаю от моего 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); 
} 
+3

Примечание: 'palavra2 [к]' не нулевой символ прекращается. – chux

+1

'for (i = 0, k = strlen (palavra) - 1; i <= k; i ++, k -)' Это настоящая плохая идея использовать 'k' в предложении' i <= k; ' а также do 'k -' Вы фактически только пишете вторую половину строки, без нулевого в конце тоже. – infixed

+0

Почему бы не использовать 'strrev'? – RoadRunner

ответ

1

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

/* 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); 
} 
+0

Что случилось с этим? –

+0

@ Jean-FrançoisFabre Huh; слишком плохо, что у меня нет голосов, иначе я бы поднял вопрос и ваш ответ, чтобы привлечь больше избирателей ... –

+0

не волнуйтесь обо мне. Ах, ваш downvote очистился. Я бы не стал поднимать вопрос BTW. Он воспроизводимый, но не очень хороший: использовать отладчик или printf было бы достаточно, чтобы понять, что происходит. Я это сделал. –

5

индексов цикла работает противоположный так что они встречаются посередине, и цикл останавливается, когда 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) так что вы должны вычислить его только один раз)

1

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

#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; 
} 

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

-1

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

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

Caller - reverse(str, 0, str.length()-1)

+0

Сокращенный. Это вопрос C, а не C++. – Bauss

 Смежные вопросы

  • Нет связанных вопросов^_^