Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск и замена по строкам - не работает в vc 2010

54K
13 мая 2010 года
Lion__
22 / / 13.05.2010
В общем есть проблема

Сегодня наткнулся на папку проектов vc 2008, посмотрел что за фигню я делал, захотел откомпилировать - ошибка.

В общем к делу:
 
Код:
char *lower(char *str) {
    for(int i=0;i<=strlen(str);i++) {
        str = char( tolower(str) );
    }

    return str;
}


В 2008 работало, в 2010 нет

Цитата:
Unhandled exception at 0x00fe1cc3 in ***.exe: 0xC0000005: Access violation writing location 0x00fe88a4.

54K
13 мая 2010 года
Lion__
22 / / 13.05.2010
Решил проблему так:
 
Код:
char *lower(char *str) {
    int len_s = strlen(str); char *ptr;
    ptr = (char *)malloc(len_s);
    for(int i=0;i<=len_s;i++) {
        ptr = char( tolower(str) );
    }

    return ptr;
}


Но может есть более логичней способ?
297
14 мая 2010 года
koodeer
1.2K / / 02.05.2009
Версия IDE здесь не при чём.
Если передавать в первую функцию ссылку на константную строку, то будет выброшено исключение:
 
Код:
char *source = "SomeText";
lower(source); // exception


lower("SomeText"); // так тоже exception


Если сделать так, то всё в порядке:
 
Код:
char source[] = "SomeText";
lower(source);


// Можно выделить память динамически, через malloc или new
char *source = new char[9]; // "магическое" число лишь для примера
strcpy(source, "SomeText");
lower(source); // тоже всё в порядке


При этом необязательно в функции возвращать указатель: сама входная строка будет приведена к нижнему регистру.

И ещё: условие i<=strlen(str); вполне можно заменить на i<strlen(str); - нет нужды терминальный нуль приводить к нижнему регистру.

Кстати, Lion, вы неправильно выделяете память под строку:
 
Код:
int len_s = strlen(str); char *ptr;
ptr = (char *)malloc(len_s);

нужно под терминальный ноль место выделить, да и размер char в принципе может быть разным. В итоге получаем:
 
Код:
int len_s = strlen(str); char *ptr;
ptr = (char *)malloc( sizeof(char) * (len_s + 1) );
54K
14 мая 2010 года
Lion__
22 / / 13.05.2010
Спасибо за пояснение)) Помогли дурочку)

нужно под терминальный ноль место выделить
Значит заканчивать надо \0??

Ну вот так:
Цитата:
char *lower(char *str) {
int i; int len_s = strlen(str); char *ptr;
ptr = (char *)malloc(sizeof(char) * (len_s + 1));
for(i=0;i<=len_s;i++) {
ptr = char( tolower(str) );
}
ptr[i++] = '\0';
return ptr;
}

297
15 мая 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: Lion__
Значит заканчивать надо \0??


Да, c-строка должна заканчиваться \0. Но если условие цикла задано в виде i<=len_s; то ноль скопируется и так. При этом и к терминальному нулю будет применена функция tolower. Что совершенно не нужно.

Если условие задать i<len_s; то будут скопированы лишь символы строки, без завершающего нуля. Это несколько повысит быстродействие (условно предполагаем, что tolower ресурсоёмка). Тогда нуль добавляем в конец новой строки вручную: ptr = '\0'; Обратите внимание - просто i, не i++. Пост инкремент совершенно ни к чему.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог