Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

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

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

Author24 — интернет-сервис помощи студентам
подскажите как задать строку без нулевого символа? когда пишешь так char str[] = "hello world" он автоматом добавляется, пробовал даже писать так char str[] = {'h','e','l'} (ну и т.д.) и все равно добавляется а очень надо без нулевого символа...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2014, 15:56
Ответы с готовыми решениями:

Как вывести строку без первого символа?
Например если дано qwerty вывести только werty

Если в строке нет символа *, то оставить эту строку без изменения
Помогите решить задачи 1)Найти сумму 10 членов ряда, в котором an=(n!)/n2. 2)Дана строка....

Ввод строки S и символа С. Результат: число повторений символа С и порядковые позиции вхождения этого символа в строку
Нужно составить программу, в которой пользователь вводит вручную строку S и символ C. Результатом...

Как удалить число после определенного символа, поставить ноль, остальную строку оставить без изменений?
Имеется столбец в каждой ячейке имеются координаты: x12 y2.43 z16.7 x43.457 y43.1 x89 z24.3...

16
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
25.07.2014, 16:02 2
C
1
char s[3] = {'a', 's', 'd'};
Добавлено через 35 секунд
Цитата Сообщение от GetHelp Посмотреть сообщение
подскажите как задать строку без нулевого символа?
Нет "строк", есть массивы байт.
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
25.07.2014, 16:06  [ТС] 3
castorsky, сначала показалось что это оно, но нет... там все равно есть нуль-байт
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
25.07.2014, 16:10 4
GetHelp, как там может что-либо добавляться, если весь массив заполнен?
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
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
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
25.07.2014, 16:17 6
Цитата Сообщение от GetHelp Посмотреть сообщение
там все равно есть нуль-байт
это просто случайность или особенности компилятора.
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
25.07.2014, 16:25 7
Цитата Сообщение от GetHelp Посмотреть сообщение
почему он идет?
Потому что нет нуля, а необходимые символы есть и программа их находит, правда уже за пределами массива.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
25.07.2014, 16:32  [ТС] 8
Цитата Сообщение от castorsky Посмотреть сообщение
Потому что нет нуля, а необходимые символы есть и программа их находит, правда уже за пределами массива.
хз там в дебаггере вообще показывает что в expression[index] какая то рандомная 'э'... (т.е. при той последней итерации, когда после второй единицы), ну и почему он заходит тогда в этот while?

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

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

Добавлено через 10 минут
Я так понимаю Вы реализуете алгоритм обратной польской нотации. Было у меня, не нашел к сожалению. Вместо atof используйте strtod. Это избавит Вас от лишней возни с числами посимвольно. Кроме этого еще рекомендую Вам не заносить разность в стек операций, а заносить туда сложение, но число записывать в стек как отрицательное (вызвав strtod прямо на знаке '-'). Конечно предварительно нужно все выражение проверить на валидность и убрать все пробелы.
0
430 / 384 / 200
Регистрация: 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
4 / 4 / 3
Регистрация: 28.09.2013
Сообщений: 152
28.07.2014, 17:22 15
Я не уверен, но разве строку от не строки отличает не нахождение нулевого символа в конце ?
0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
29.07.2014, 15:40 16
Цитата Сообщение от GetHelp Посмотреть сообщение
че ж делать то...
Использовать нормальные строки с нулём в конце...
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
29.07.2014, 16:17 17
GetHelp, вот почитайте: Строковые литералы в Си/Си++
0
29.07.2014, 16:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2014, 16:17
Помогаю со студенческими работами здесь

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

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

Как читать строку в массив до определенного символа и после продолжить чтение опять до символа
Как читать строку в массив до определенного символа и после продолжить чтение опять до символа. к...

Замена символа в строке на число соответствующему номеру по порядку вхождения этого символа в строку
В заданной строке заменить каждый символ «*» числом, соответствующим номеру по порядку вхождения...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru