2011-01-24 4 views
0

Я пытаюсь изучить основы C, но я не могу понять, почему этот код не работает. Цикл while в обратном порядке() вызывает ошибку шины. Я нашел почти идентичный код в книге интервью с программированием в качестве действительного решения, но ни этот, ни другие подобные методы, которые я видел здесь, не работают без ошибок шины.In-Place String Reverse in C

#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; 
} 
+1

См http://stackoverflow.com/questions/4493139/are-string-literals-const и многие другие вопросы (например, по крайней мере, один раз в неделю) на SO. – ephemient

ответ

4

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

+0

Спасибо! Это очень помогает. – Tiki

2

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

Изменить

char* a = "12"; 

в

char a[] = "12"; 
+0

Ничего себе, спасибо большое! – Tiki

-2

Поскольку 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; 
} 
+0

"объект"? Это C! (В любом случае, 'end' и' str' указывают только на то же место для пары строк кода.) – ladenedge

+0

Не хватает точки in situ reverse: используйте два указателя, которые работают в строковом буфере. Низкий уровень, конечно; но он должен быть эффективным и быстрым. – winwaed

+1

@ladenedge: «Объект» - это правильное слово, используемое в стандарте языка C. –