Форум программистов, компьютерный форум CyberForum.ru

Задать строку без нулевого символа - C++

Восстановить пароль Регистрация
 
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
25.07.2014, 15:56     Задать строку без нулевого символа #1
подскажите как задать строку без нулевого символа? когда пишешь так char str[] = "hello world" он автоматом добавляется, пробовал даже писать так char str[] = {'h','e','l'} (ну и т.д.) и все равно добавляется а очень надо без нулевого символа...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 15:56     Задать строку без нулевого символа
Посмотрите здесь:

C++ Как считать строку scanf'ом при этом не переходя на новую строку, т.е. без использования Enter'а
Как вывести строку, которая состоит из аргументов командной строки так, чтобы каждое слово выводилось без первого символа C++
C++ Если в строке нет символа +, то оставить строку без изменений, иначе каждую из цифр перед символом + заменять на *
C++ Определить последнее вхождение символа “р” в строке и вывести строку, начиная с первого символа и до последнего “р” в строке
C++ Если в тексте нет символа +, то оставить текст без изменения, иначе каждую из цифр, предшествующую первому вхождению символа +, заменить символом -
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
25.07.2014, 16:02     Задать строку без нулевого символа #2
C
1
char s[3] = {'a', 's', 'd'};
Добавлено через 35 секунд
Цитата Сообщение от GetHelp Посмотреть сообщение
подскажите как задать строку без нулевого символа?
Нет "строк", есть массивы байт.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
25.07.2014, 16:06  [ТС]     Задать строку без нулевого символа #3
castorsky, сначала показалось что это оно, но нет... там все равно есть нуль-байт
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,094
25.07.2014, 16:10     Задать строку без нулевого символа #4
GetHelp, как там может что-либо добавляться, если весь массив заполнен?
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
25.07.2014, 16:17  [ТС]     Задать строку без нулевого символа #5
Цитата Сообщение от NoMasters Посмотреть сообщение
GetHelp, как там может что-либо добавляться, если весь массив заполнен?
не знаю, но у меня че то не выходит, хотите вот код...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
bool GetSolve(char* Expression, double* result) //Математический интерпретатор
{
    if (!Expression) return false; //Если строка пустая - выход
    //тут еще надо добавить удаление пробелов...
    Stack<char> operations; //Стек для операций
    Stack<double> numbers; //Стек для чисел
    const char set_operations[7] = {'(',')','+','-','*','/','^'}; //Операции
    const char set_numbers[11] = {'0','1','2','3','4','5','6','7','8','9','.'}; //Числа
    int len = strlen(Expression); //Длина строки
 
    //Заполняем оба стека
    for (int i = 0; i < len; i++) //Цикл по строке
    {
        if (strchr(set_operations, Expression[i])) //Если символ - операция
        {
            char c = Expression[i];
            operations.Push(&c); //Добавляем в стек
            continue; //Выходим из итерации
        }
        if (strchr(set_numbers, Expression[i])) //Если символ - цифра
        {
            int index = i; //Счетчик, начинающийся с текущей позиции основного цикла
            Stack<char> tmp; //Временный стек для числа
            while (strchr(set_numbers, Expression[index++])) //Цикл по строке начинаю с текущей позиции основного цикла
            {
                char c = Expression[index-1]; //Текущий символ
                tmp.Push(&c); //Добавляем в стек
            }
            char* tmp_s = new char[tmp.GetSize()]; //Временный массив для значений из стека
            if (tmp.GetArray(tmp_s)) //Получаем значения из стека в массив
            {
                tmp_s = StrWithNull(tmp_s, tmp.GetSize());
                double tmp_d = atof(tmp_s); //Переводим строку в число
                numbers.Push(&tmp_d); //Добавляем число в стек
            }
        }
        else return false; //Если символ не операция и не число - выход
    }
    return true;
}
тут еще правда только заполнение стеков, самой интерпретации нет пока... цикл while на 24 строке, допустим Expression = "1+1", вот когда идет соответственно второй раз по этому циклу (вторая единичка), он проходит и потом снова идет... почему он идет? я могу предположить только нулевой символ...
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
25.07.2014, 16:17     Задать строку без нулевого символа #6
Цитата Сообщение от GetHelp Посмотреть сообщение
там все равно есть нуль-байт
это просто случайность или особенности компилятора.
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
25.07.2014, 16:25     Задать строку без нулевого символа #7
Цитата Сообщение от GetHelp Посмотреть сообщение
почему он идет?
Потому что нет нуля, а необходимые символы есть и программа их находит, правда уже за пределами массива.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
25.07.2014, 16:32  [ТС]     Задать строку без нулевого символа #8
Цитата Сообщение от castorsky Посмотреть сообщение
Потому что нет нуля, а необходимые символы есть и программа их находит, правда уже за пределами массива.
хз там в дебаггере вообще показывает что в expression[index] какая то рандомная 'э'... (т.е. при той последней итерации, когда после второй единицы), ну и почему он заходит тогда в этот while?

Добавлено через 3 минуты
я щас вообще заметил что он туда заходит даже когда '+' это вообще че то за гранью моего понимания...
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
25.07.2014, 16:33     Задать строку без нулевого символа #9
GetHelp, Потому что массив set_numbers не имеет нуль терминанта и strchr вполне может найти 'э' за пределами массива, в том числе и саму себя, т.е. ту же 'э', которая лежит в expression.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
25.07.2014, 16:34  [ТС]     Задать строку без нулевого символа #10
Цитата Сообщение от castorsky Посмотреть сообщение
GetHelp, Потому что массив set_numbers не имеет нуль терминанта и strchr вполне может найти 'э' за пределами массива, в том числе и саму себя, т.е. ту же 'э', которая лежит в expression.
черт у меня взрыв мозга щас будет ! че ж делать то...
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
25.07.2014, 16:35     Задать строку без нулевого символа #11
Цитата Сообщение от GetHelp Посмотреть сообщение
я щас вообще заметил что он туда заходит даже когда '+' это вообще че то за гранью моего понимания...
перепишите так:
C
1
2
const char * set_operations = "()+-*/^"; /* Операции */
    const char * set_numbers = "0123456789."; /* Числа */
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
25.07.2014, 16:39  [ТС]     Задать строку без нулевого символа #12
castorsky, да так и было изначально, но в таком случае при последней итерации в стек заносится '\0', что мешает его конвертации в число...
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
25.07.2014, 16:54     Задать строку без нулевого символа #13
Цитата Сообщение от GetHelp Посмотреть сообщение
да так и было изначально, но в таком случае при последней итерации в стек заносится '\0', что мешает его конвертации в число...
Значит следует доработать алгоритм.

Добавлено через 2 минуты
Вам-то как раз и нужен нуль терминант для того чтобы strchr не выходила за пределы массива. А у Вас его нет, поэтому strchr находит "мусор" за пределами массива.

Добавлено через 10 минут
Я так понимаю Вы реализуете алгоритм обратной польской нотации. Было у меня, не нашел к сожалению. Вместо atof используйте strtod. Это избавит Вас от лишней возни с числами посимвольно. Кроме этого еще рекомендую Вам не заносить разность в стек операций, а заносить туда сложение, но число записывать в стек как отрицательное (вызвав strtod прямо на знаке '-'). Конечно предварительно нужно все выражение проверить на валидность и убрать все пробелы.
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
26.07.2014, 09:33     Задать строку без нулевого символа #14
Я бы сделал как-то так:

C
1
2
3
4
5
6
int kind_of_symbol(char c)
{
    if( strchr("()+-*/^", c) ) { return 1; }
    if( strchr ("0123456789.", c) ) { return 2; }
    return 0;
}
Кстати, ты уверен, что это язык С?

C++
1
Stack<char> operations;
NikitoZZZ
4 / 4 / 1
Регистрация: 28.09.2013
Сообщений: 141
28.07.2014, 17:22     Задать строку без нулевого символа #15
Я не уверен, но разве строку от не строки отличает не нахождение нулевого символа в конце ?
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
29.07.2014, 15:40     Задать строку без нулевого символа #16
Цитата Сообщение от GetHelp Посмотреть сообщение
че ж делать то...
Использовать нормальные строки с нулём в конце...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2014, 16:17     Задать строку без нулевого символа
Еще ссылки по теме:

C++ Дан символ C и строки S, S0. После каждого вхождения символа C в строку S вставить строку S0
Создать строку: с начало три символа первой строки, потом эти же три символа в обратном порядке C++
Даны строка S, символ C и строка S0. Необходимо после каждого вхождения символа C в строку S вставить строку S0 C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
29.07.2014, 16:17     Задать строку без нулевого символа #17
GetHelp, вот почитайте: Строковые литералы в Си/Си++
Yandex
Объявления
29.07.2014, 16:17     Задать строку без нулевого символа
Ответ Создать тему
Опции темы

Текущее время: 18:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru