Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

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

25.07.2014, 15:56. Просмотров 887. Ответов 16
Метки нет (Все метки)

подскажите как задать строку без нулевого символа? когда пишешь так char str[] = "hello world" он автоматом добавляется, пробовал даже писать так char str[] = {'h','e','l'} (ну и т.д.) и все равно добавляется а очень надо без нулевого символа...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 15:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задать строку без нулевого символа (C++):

Если в строке нет символа +, то оставить строку без изменений, иначе каждую из цифр перед символом + заменять на * - C++
Ввести символьный массив из 12 символов. Если в тексте нет символа +, то оставить без изменений, в другом случаи каждую из цифр перед...

Как вывести строку, которая состоит из аргументов командной строки так, чтобы каждое слово выводилось без первого символа - C++
Полное условие:Если первый аргумент командной строки-опция-а, то распечатать другие аргументы без их первых символов, а если первой идет...

Если в тексте нет символа +, то оставить текст без изменения, иначе каждую из цифр, предшествующую первому вхождению символа +, заменить символом - - C++
Дан текст. Если в тексте нет символа +, то оставить текст без изменения, иначе каждую из цифр, предшествующую первому вхождению символа +,...

Создать строку: с начало три символа первой строки, потом эти же три символа в обратном порядке - C++
Помогите пожалуйста! Ввести строку символов. Создать новую строку следующим образом: с начало три символа первой строки, потом эти же три...

Перед каждым вхождением заданного символа в строку S вставить строку S0 - C++
Дан символ C и строки S, S0 . Перед каждым вхождением символа C в строку S вставить строку S0 .

Определить последнее вхождение символа “р” в строке и вывести строку, начиная с первого символа и до последнего “р” в строке - C++
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить последнее вхождение символа “р” в строке и вывести строку, начиная с...

16
castorsky
1968 / 1070 / 79
Регистрация: 29.11.2013
Сообщений: 3,341
25.07.2014, 16:02 #2
C
1
char s[3] = {'a', 's', 'd'};
Добавлено через 35 секунд
Цитата Сообщение от GetHelp Посмотреть сообщение
подскажите как задать строку без нулевого символа?
Нет "строк", есть массивы байт.
1
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
25.07.2014, 16:06  [ТС] #3
castorsky, сначала показалось что это оно, но нет... там все равно есть нуль-байт
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
25.07.2014, 16:10 #4
GetHelp, как там может что-либо добавляться, если весь массив заполнен?
0
GetHelp
-7 / 61 / 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", вот когда идет соответственно второй раз по этому циклу (вторая единичка), он проходит и потом снова идет... почему он идет? я могу предположить только нулевой символ...
0
castorsky
1968 / 1070 / 79
Регистрация: 29.11.2013
Сообщений: 3,341
25.07.2014, 16:17 #6
Цитата Сообщение от GetHelp Посмотреть сообщение
там все равно есть нуль-байт
это просто случайность или особенности компилятора.
0
castorsky
1968 / 1070 / 79
Регистрация: 29.11.2013
Сообщений: 3,341
25.07.2014, 16:25 #7
Цитата Сообщение от GetHelp Посмотреть сообщение
почему он идет?
Потому что нет нуля, а необходимые символы есть и программа их находит, правда уже за пределами массива.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
25.07.2014, 16:32  [ТС] #8
Цитата Сообщение от castorsky Посмотреть сообщение
Потому что нет нуля, а необходимые символы есть и программа их находит, правда уже за пределами массива.
хз там в дебаггере вообще показывает что в expression[index] какая то рандомная 'э'... (т.е. при той последней итерации, когда после второй единицы), ну и почему он заходит тогда в этот while?

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

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

Добавлено через 10 минут
Я так понимаю Вы реализуете алгоритм обратной польской нотации. Было у меня, не нашел к сожалению. Вместо atof используйте strtod. Это избавит Вас от лишней возни с числами посимвольно. Кроме этого еще рекомендую Вам не заносить разность в стек операций, а заносить туда сложение, но число записывать в стек как отрицательное (вызвав strtod прямо на знаке '-'). Конечно предварительно нужно все выражение проверить на валидность и убрать все пробелы.
0
Vtulhu
371 / 377 / 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;
0
NikitoZZZ
4 / 4 / 1
Регистрация: 28.09.2013
Сообщений: 150
28.07.2014, 17:22 #15
Я не уверен, но разве строку от не строки отличает не нахождение нулевого символа в конце ?
0
28.07.2014, 17:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 17:22
Привет! Вот еще темы с ответами:

Дан символ C и строки S, S0. После каждого вхождения символа C в строку S вставить строку S0 - C++
Дан символ C и строки S, S0. После каждого вхождения символа C в строку S вставить строку S0. Помогите пожалуйста с реализацией на Си

Возможно ли без использования цикла получить символ с конца нулевого аргумента main()? - C++
Использую имя файла как аргумент для предварительной настройки программы. Хочу без помощи поиска в цикле получить пред-пред-пред последний...

Как задать цвет одного символа в консоли? - C++
итак рисую символ cor.X = (SHORT)j; cor.Y = (SHORT)i; SetConsoleCursorPosition(hConsole,cor); ...

Даны строка S, символ C и строка S0. Необходимо после каждого вхождения символа C в строку S вставить строку S0 - C++
Есть код... string s, s0; char c; cout &lt;&lt; &quot;Введите строку s, s0 и символ c: &quot;; getline(cin, s); ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru