Инвертировать строку в 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)