Заменить символ ошибки сегментации языка c strchr - PullRequest
1 голос
/ 23 августа 2011

Мне нужно заменить каждое вхождение '&' to ',' в строке C.

Я сделал это, и это работает

Код 1:

char *val, *querydup;
.
.
.
val=strchr(querydup,'&');
while(val != NULL) {
*val=',';
val=strchr(querydup,'&');
}

Для того, чтобы быть "элегантным", я попробовал следующее, но это приводит к ошибке сегмента, к точке, где даже мой указатель курсора поврежден !. странно, я запускаю Linux внутри VMware VM.

Код 2:

while(val=strchr(querydup,'&') != NULL) {
*val=',';
}

Так что может быть не так? ..

Считаете ли вы код 1 "элегантным"? ...

Привет.

Ответы [ 4 ]

6 голосов
/ 23 августа 2011

Ваш главный вопрос получен ответ от emboss .

Я отвечаю на часть "элегантность":)

Вы проверяете одни и те же символы снова и снова.

Предположим, querydup имеет "&&&&&&&&&&". После первых нескольких изменений он имеет ",,,,,,&&&&", и все равно вы все равно проверяете с самого начала.

Попробуйте повторно использовать val для "элегантности":)

val = strchr(val, '&');
4 голосов
/ 23 августа 2011

Это приоритет оператора , попробуйте

while((val=strchr(querydup,'&')) != NULL) {
    *val=',';
}
3 голосов
/ 23 августа 2011

Возможно, более простым решением было бы на самом деле сделать это вручную:

char *ptr = querydup;
while (*ptr) {
    if (*ptr == '&') {
        *ptr = ',';
    }
    ptr++;
}

Это больше строк кода, но он проходит через строку только один раз, где повторные исполнения strchr () пройдутстрока несколько раз.

1 голос
/ 23 августа 2011

Вы присваиваете val логическое значение.Ваш код эквивалентен:

while(val = (strchr(querydup,'&') != NULL))

Измените его на:

while((val = strchr(querydup,'&')) != NULL)
...