In-Place String Reverse в C - PullRequest
       17

In-Place String Reverse в C

0 голосов
/ 24 января 2011

Я пытаюсь изучить основы 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;
}

Ответы [ 3 ]

4 голосов
/ 24 января 2011

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

2 голосов
/ 24 января 2011

Вы пытаетесь изменить строковый литерал, который приводит к неопределенному поведению.

Изменение

char* a = "12";

до

char a[] = "12";
0 голосов
/ 24 января 2011

Потому что 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;
}
...