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

Ваш аккаунт

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

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

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

Замена в строке на С

32K
05 февраля 2010 года
xface
43 / / 07.11.2009
Привет. Помогите пожайлуста организовать замену символов в строке на С. Например: -3+4-7 заменить на #-3#4#-7, т. е перед знаком минус ставить решетку, а знак плюс заменять на решетку. Пробовал заменять по символьно, ипользуя strcat(), но в тексте в начале строки появляются кракозябры:

Код:
int main()
{
    char str[255];
    char str2[255];
    char s[1];
    int i;
    gets(str);
    for (i = 0; i < strlen(str); i++)
    {
    s[0] = str;
    if (str == '-')
    strcat(str2, "#-");
    else
    if (str == '+')
    strcat(str2, "#");
    else
    strcat(str2, s);
    }
    printf("%s", str2);
}

В чем может быть проблема?
297
06 февраля 2010 года
koodeer
1.2K / / 02.05.2009
При объявлении char str2[255]; в массиве находится мусор, те самые кракозябры. Именно к ним вы и прибавляете свои символы.

В Си строки являются нуль-терминированными, т. е. с символом '\0' в конце. Поэтому нужно в конец строки str2 (изначально пустой) записать ноль. Другими словами, эта строка в вашем случае должна состоять вначале из одного нуля (подсказка: можно просто "").

Функция strcat работает именно с такими строками. Поэтому прибавление одного символа strcat(str2, s); ошибочно. В конце строки s тоже должен быть символ '\0'.
32K
06 февраля 2010 года
xface
43 / / 07.11.2009
Цитата: koodeer
При объявлении char str2[255]; в массиве находится мусор, те самые кракозябры. Именно к ним вы и прибавляете свои символы.

В Си строки являются нуль-терминированными, т. е. с символом '\0' в конце. Поэтому нужно в конец строки str2 (изначально пустой) записать ноль. Другими словами, эта строка в вашем случае должна состоять вначале из одного нуля (подсказка: можно просто "").

Функция strcat работает именно с такими строками. Поэтому прибавление одного символа strcat(str2, s); ошибочно. В конце строки s тоже должен быть символ '\0'.



Спасибо. А я и забыл что-то, то что str2 обнулить надо) А можно обнулить str2 не посимвольно, как тут:

 
Код:
for (i=0; i<255;i++)
 str2='\0';


а по другому?
8.4K
06 февраля 2010 года
z0rch
275 / / 02.09.2008
Цитата: koodeer
Другими словами, эта строка в вашем случае должна состоять вначале из одного нуля (подсказка: можно просто "").


подсказки не читаем?))

32K
06 февраля 2010 года
xface
43 / / 07.11.2009
Цитата: z0rch
подсказки не читаем?))



Все читаем) Просто компилятор выдавал ошибку при обнулении в коде, например str = ""; А если обнулить при инициализации переменной (char str[255] = "";), то все работает. Поэтому и спросил, т.к если потребуется ее обнулить после использования в середине программы, то такой способ не прокатит(

242
07 февраля 2010 года
Оlga
2.2K / / 04.02.2006
Цитата: xface
Все читаем) Просто компилятор выдавал ошибку при обнулении в коде, например str = ""; А если обнулить при инициализации переменной (char str[255] = "";), то все работает. Поэтому и спросил, т.к если потребуется ее обнулить после использования в середине программы, то такой способ не прокатит(


в чем смысл обнулять каждую ячейку массива? достаточно обнулить первый элемент массива, под индексом ноль, и все.


а что, использование функции strcat это принципиально? обыкновенным присвоением можно обойтись, в цикле прохода по массиву:

Код:
for(i = 0, j = 0; i < size_str; ++i, ++j)
{
           if(str == '+')
          {
                 str2[j] = '#';
                 continue;
          }
          else if(str == '-')
          {
                str2[j] = '#';
                ++j;
          }
          str2[j] = str;
}
после фора новой строке надо ноль добавить, конец строки обозначить.
32K
07 февраля 2010 года
xface
43 / / 07.11.2009
Цитата: Оlga

а что, использование функции strcat это принципиально? обыкновенным присвоением можно обойтись, в цикле прохода по массиву:



А какой код с точки зрения быстродействия и "правильности" написания лучше ? Сначала, я таким же методом делать пробовал, но что-то там не получалось)

242
07 февраля 2010 года
Оlga
2.2K / / 04.02.2006
Цитата: xface
А какой код с точки зрения быстродействия и "правильности" написания лучше ? Сначала, я таким же методом делать пробовал, но что-то там не получалось)


насчет быстродействия, насколько я понимаю, без strcat код быстрей, хотя с сегодняшними компами даже в более серьезных программах можно не прочувствовать особой разницы, а уж в такой программе и подавно, а правильности, я не специалист, извини, но если бы мне надо было бы решить эту задачу, я бы так написала, как написала выше, ну или может немного бы изменила бы, но суть такова же, не вижу причин использования готовых, сторонних функций.
посуди сам:
1. вызов функции и передача параметров
2. функция должна пройти от начала str2 до его конца при каждом вызове и только после этого добавлять требуемые символы.
3. возврат к исходной функции

тогда как если ты держишь текущий индекс для str2, то нет никакой необходимости каждый раз проходить этот массив, просто добавляешь требуемые символы и делаешь инкремент индексу - гораздо меньше телодвижений )).

при большем количестве данных подобные вещи могут играть роль.
а так конечно у меня нет практического опыта, чтобы судить более глубоко )))

32K
07 февраля 2010 года
xface
43 / / 07.11.2009
Оlga, спасибо за разъяснение. Да если подумать, использование сторонних функций медленнее, чем "элементарные" операции, хотя не во всех случаях)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог