Переверните строку c-типа

Вот мой код:

    void reverseStr(char *str)
{
    if (str == NULL) return;
    int i=0, j=strlen(str) -1;
    while(i<j)
    {
        char temp = str[j];  //i think this is the cause of the problem
        str[j] = str[i];
        str[i] = temp;
        i++;
        j--;
    }
}

Вот где это называется:

int main()
{   
    char *str = "Forest Gump";
    reverseStr(str);
    cout << str;
}

Вот моя ошибка:

/Applications/TextMate.app/Contents/SharedSupport/Bundles/C.tmbundle/Support/bin/bootstrap.sh: строка 7: 1931 Ошибка шины "$ 3" .out

Есть предположения? Заранее спасибо.


person nababa    schedule 16.08.2010    source источник
comment
Пожалуйста, разместите код, который вызывает reverseStr.   -  person CB Bailey    schedule 17.08.2010
comment
Строка оканчивается нулем?   -  person Paul Tomblin    schedule 17.08.2010
comment
Похоже, TextMate разбился. Как вы думаете, почему ваш исходный код имеет к этому какое-то отношение? Вы пробовали свой код в каком-нибудь другом редакторе? Компилируется ли ваш код с помощью компилятора C командной строки? А как насчет XCode?   -  person Rob Kennedy    schedule 17.08.2010
comment
Когда вы разместите вызывающий код, мы узнаем, является ли это дубликатом stackoverflow.com/questions/2345584/reversing-a-string-in-c.   -  person CB Bailey    schedule 17.08.2010
comment
просто комментарий стиля, я бы использовал цикл for вместо цикла while. Кроме того, я думаю, что ваш метод сломается для симметричных строк. И это, вероятно, должно быть помечено C, а не C ++, иначе вы должны просто использовать std :: string   -  person Falmarri    schedule 17.08.2010
comment
Стоит упомянуть, что этот алгоритм и тот, который упоминает @Charles, не пройдут тесты на глобализацию. Если вас интересуют подробности, ознакомьтесь с msmvps.com/blogs/jon_skeet/archive/2009/11/02/.   -  person kbrimington    schedule 17.08.2010
comment
Для меня это дает EXC_BAD_ACCESS.   -  person    schedule 17.08.2010
comment
@ Роб Кеннеди: Предположительно, он использует textmate в качестве IDE, чтобы запустить свой встроенный код. bootstap.sh?   -  person CB Bailey    schedule 17.08.2010
comment
Вы рассматривали возможность запуска программы в отладчике?   -  person Andre Holzner    schedule 17.08.2010
comment
Когда я запустил этот код, мой компьютер загорелся, а затем взорвался мой дом :(   -  person Brian R. Bondy    schedule 17.08.2010
comment
Это определенно не C. C не использует << для обозначения чего-либо, кроме сдвига влево.   -  person nmichaels    schedule 17.08.2010
comment
@ Брайан Р. Бонди: Надеюсь, ваша страховка покрывает носовых демонов.   -  person torak    schedule 17.08.2010
comment
Мой компилятор (gcc 4.2) выдает предупреждение, когда я пытаюсь назначить литерал неконстантному типу char *: устаревшее преобразование строковой константы в «char *». Поскольку вы, очевидно, используете C ++ (cout), мне интересно, не выдал ли вам компилятор это предупреждение или вы просто проигнорировали его?   -  person Frank Osterfeld    schedule 17.08.2010
comment
Возможный дубликат Обратной строки в стиле C? - C ++   -  person ivan_pozdeev    schedule 18.08.2018


Ответы (3)


Str указывает на фиксированную строку. Вы модифицируете его на месте. Другими словами, вы пытаетесь изменить текстовый литерал. Попробуй это:

char *str = strdup("Forest Gump"); 
reverseStr(str); 
cout << str; 
free(str);
person James Curran    schedule 16.08.2010
comment
Или просто char str[] = "Forest Gump"; устранение необходимости в выделении памяти и управлении ею. - person TheUndeadFish; 17.08.2010

Строковые литералы - это память только для чтения, вы не можете их отменить или изменить, не столкнувшись с неопределенным поведением.

Сначала скопируйте вашу строку в буфер, а затем передайте в буфер. Или объявите массив вместо указателя и инициализируйте этот массив с помощью инициализатора строки.

person Brian R. Bondy    schedule 16.08.2010
comment
Нет, поскольку i > j в этом случае - person palswim; 17.08.2010
comment
@palswim: Я изменил свой ответ, я понял это сразу после того, как разместил его. - person Brian R. Bondy; 17.08.2010
comment
фактически, в Linux с gcc он SIGSEGV указывает строку str [j] = str [i]; (где i = 0 и j = 10). - person Andre Holzner; 17.08.2010
comment
Да, я собирался опубликовать тот же ответ прямо тогда, когда вы это сделали, прежде чем я понял, что ошибка strlen () == 0 не вызовет проблем. - person palswim; 17.08.2010

Ошибка в сценарии bash / shell, которого нет в вашей программе. Не могли бы вы также опубликовать сценарий bash?

person schoetbi    schedule 16.08.2010