@R .: Хорошо закрой мне рот. «объект: область хранения данных в среде выполнения, содержимое которой может представлять значения». Спасибо за исправление!

аюсь изучить основы C, но я не могу понять, почему этот код не работает. Цикл while в reverse () вызывает ошибку шины. Я нашел почти идентичный код в книге собеседований по программированию как правильное решение, но ни этот, ни другие похожие методы, которые я видел размещенные здесь, не работают для меня без ошибки шины.

#include <stdio.h>

void reverse(char* str) {
 char* end = str;
 char tmp = 0;
 if(str) {
  while(*end) {
   end++;
  }
  --end;
  while(end>str) {
   tmp = *end;
   *end-- = *str;
   *str++ = tmp;
  }
 }
}

int main() {
 char* a = "12";
 puts(a);
 reverse(a);
 puts(a);

 return 0;
}
 ephemient24 янв. 2011 г., 20:05
Видетьstackoverflow.com/questions/4493139/are-string-literals-const и многие другие вопросы (как минимум, один раз в неделю) о SO.

Ответы на вопрос(3)

Решение Вопроса

что вы пытаетесь перевернуть константу литеральной строки, которая доступна только для чтения. Изменить объявлениеa вmain вchar a[] = "12"; вместо этого сделать его доступным для записи массивом символов

 Tiki24 янв. 2011 г., 20:11
Спасибо! Это очень помогает.

Потому чтоend а такжеstr указывают на одну и ту же ячейку памяти -> это два разных имени одного и того же объекта. Вы можете избежать использования двух переменных:

char foo[20] = "abcdefghi", tmp;
int counter = 0, length = strlen(foo);

for(counter, counter < length / 2; counter++) {
    tmp = foo[counter];
    foo[counter] = foo[length - counter];
    foo[length - counter] = tmp;
}
 ladenedge26 янв. 2011 г., 21:58
@R .: Хорошо закрой мне рот. «объект: область хранения данных в среде выполнения, содержимое которой может представлять значения». Спасибо за исправление!
 ladenedge24 янв. 2011 г., 20:07
«Объект»? Это С! (Так или иначе,end а такжеstr указывать только на одно и то же место для пары строк кода.)
 R..24 янв. 2011 г., 20:26
@ladenedge: «Объект» - правильное слово, используемое в стандарте языка C.
 winwaed24 янв. 2011 г., 20:08
Этого не хватает точке обратного хода: используйте два указателя, которые работают в строковом буфере. Низкоуровневые вещи, конечно; но это должно быть эффективно и быстро.

который приводит к неопределенному поведению.

+ Изменить

char* a = "12";

в

char a[] = "12";
 Tiki24 янв. 2011 г., 20:10
Вау, спасибо большое!

Ваш ответ на вопрос