2013-10-04 2 views
1

reverser() отменяет cstring (не на месте). 99% времени, когда он работает, но какой-то ввод искажает его, например, появляется, если aStr2 [] назначается строка, состоящая из одного и того же символа, у нее будет ошибка.Нужна помощь в поиске ошибки, если строковый ввод состоит из одного и того же символа, один выходной символ поврежден

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

char* reverser(const char *str); 

int main() 
{ 
    char aStr[] = "aaa"; 
    char aStr2[] = "cccccc"; 
    printf("%s %s", aStr, aStr2); 
    char* tmp = reverser(aStr2);//tmp now has garbage 
    printf("\n%s", tmp); 
    printf(" %s", aStr2); 
    return 0; 
} 


char* reverser(const char *str) 
{ 
    char* revStr = (char*)malloc(strlen(str)); 
    int i; 
    for(i = strlen(str)-1; i >= 0; i--) 
{ 
     revStr[strlen(str)-1-i] = str[i]; 
} 
    return revStr; 
} 

дает

aaa cccccc 
cccccc9 cccccc 
Process returned 0 (0x0) execution time : 0.068 s 
Press any key to continue 

Обратите внимание на 9, что там не должно быть.

+1

Давайте представим, что я просматривающие с изображениями выключен , Теперь, как я должен знать результат? Опубликуйте текст вместо скриншотов. –

+1

[Также не указывайте возвращаемое значение 'malloc()'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858). –

+0

Возможный дубликат [C строк malloc (вывод)] (http://stackoverflow.com/questions/19249734/c-strings-malloc-output) – hyde

ответ

2

Изменить этот таНос к STRLEN (ул) + 1, плюс 1 для '\ 0'

char* revStr = (char*)malloc(strlen(str) + 1); 

и после того, как цикл

revStr[strlen(str)+1] = '\0'; 
0

У вас нет завершенной нулевой строки. Вам нужно установить окончательный индекс revStr [] равным 0.

2

Ваша проблема заключается в том, что вы не помещаете ограничитель строки в свою обратную строку. Все строки в C на самом деле являются одним дополнительным символом, который не сообщается strlen, и это символ '\0' (или простой, простой, ноль). Это говорит о всех функциях C, когда строка заканчивается.

Поэтому вам необходимо выделить место для этого дополнительного символа терминатора в вашем вызове malloc и добавить его после последнего символа в строке.

Есть еще пара проблем с кодом, во-первых, вы не должны использовать возврат malloc (или любую другую функцию, возвращающую void *). Другое, что у вас есть утечка памяти, поскольку вы не освобождаете память, которую вы выделяете. Этот последний вопрос не имеет значения в небольшой программе, такой как у вас здесь, но будет проблемой в более крупных и более длинных программах.

+0

Где можно будет называться? Он не может идти до 'return' – Celeritas

+0

@Celeritas Функция, вызывающая' реверс', когда вы закончите со строкой. –

+0

Если переменной присваивается возвращаемое значение «реверс» внутри цикла, нужно ли освобождать каждую итерацию? – Celeritas

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

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