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

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

Войти
Регистрация
Восстановить пароль
 
ExeTwezz
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 16
Завершенные тесты: 1
#1

Разделить строку по пробелам (без потоков) - C++

06.04.2014, 00:13. Просмотров 433. Ответов 7
Метки нет (Все метки)

Здравствуйте. Я решаю задачку из книги, надо написать небольшую оболочку. Использую Linux.
Думаю над тем, как разделить строку (команду), введённую пользователем так, чтобы в одну переменную (command) записалось название команды, а в другую (parameters) - операнды.
Пока что имею следующий код:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <unistd.h> // execve()
#include <sys/wait.h>   // waitpid()
using namespace std;
 
/*
 * Вывод приглашения на экран.
 */
void type_prompt() {
    cout << "$ ";
}
 
/*
 * Чтение ввода с терминала.
 */
void read_command(const char* command, char* const* parameters) {
    char* entered;
    cin >> entered;
    
    bool space = false; // Нужно для различения названия команды и её операндов.
 
    for(int i = 0; entered[i] != '\0'; i++) {
        if(!space && entered[i] == ' ') { // Конец названия команды?
            space = true;
        } else {
            if(!space) { // Пока что название команды
                command += entered[i];
            } else { // Операнды
                parameters += entered[i];
            }
        }
    }
}
 
int main() {
    int status;
    const char* command;
    char* const* parameters;
 
    while(true) {
        type_prompt(); // Вывод приглашения на экран
        read_command(command, parameters); // Чтение ввода с терминала
 
        if(fork() != 0) { // Ответвление дочернего процесса
            /* Код родительского процесса */
            waitpid(-1, &status, 0);
        } else {
            /* Код дочернего процесса */
            execve(command, parameters, 0); // Выполнение command
        }
 
    }
    return 0;
}
По сути, меня интересует только read_command().
При запуске компилированного выше кода и при вводе, например, /bin/ls, получаю "Ошибка сегментирования". Я знаю, что это связано с entered[i] и то, что если entered будет строкой, то ошибки сегментирования не будет, но ничего происходить не будет. В таком случае, меня интересует не только read_command(), но и то, почему ничего не выводится.
Я пытался вывести command и parameters, но программа зависала.
В чём же ошибка?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2014, 00:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разделить строку по пробелам (без потоков) (C++):

Разделить строку по пробелам и записать полученные части в массив - C++
Здравствуйте. Подскажите, есть ли способ разделить строку по пробелам и записать полученные части в массив (по сути, аналог Split() в c#)?

Разделить строку на строку и переменную - C++
Задача: В первой строке ввода задаётся число n, далее n строк вида &quot;Insert X&quot;, где X — натуральное число, или &quot;Extract&quot;. Нужно, чтобы...

Разделить строку - C++
считываю из файла строку E:\Путь к файлу\ Е:\путь к файлу надо ее разделить на две части в путях могут быть пробелы

Ввод через файл без использования потоков - C++
Добрый день Меня интересует вопрос как сделать ввод через файл без использования потоков. Это вот так или нет? int main() { ...

Разделить строку на массив - C++
Помогите разбить строку на слова и занести их в массив. Разбил. Теперь нужно вносить их в указатели на указатели? #define...

Разделить строку на части - C++
Доброго времени суток. Имеется строка: char *pBuf=new char; заполняется она таким образом: int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2014, 00:19 #2
C++
1
2
const char* command;
char* const* parameters;
Память нужно выделить.
0
ExeTwezz
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 16
Завершенные тесты: 1
06.04.2014, 10:41  [ТС] #3
В смысле дать размер?
C++
1
2
const char* command[50];
char* const* parameteres[100];
Ошибка:
zesh.cpp: In function ‘int main()’:
zesh.cpp:47:35: error: cannot convert ‘const char**’ to ‘const char*’ for argument ‘1’ to ‘void read_command(const char*, char* const*)’
zesh.cpp:55:33: error: cannot convert ‘const char**’ to ‘const char*’ for argument ‘1’ to ‘int execve(const char*, char* const*, char* const*)’

Если нет, то что вы имели в виду?
0
recoder
130 / 130 / 28
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
06.04.2014, 10:51 #4
К чему вы тут прибавляете?
C++
1
2
command += entered[i];
parameters += entered[i];
0
ExeTwezz
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 16
Завершенные тесты: 1
06.04.2014, 11:16  [ТС] #5
А как тогда?
Я где-то видел на форуме, там спрашивали, как перевести буквы строки в верхний регистр, вот и взял for от туда.
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
06.04.2014, 11:46 #6
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
void read_command(char* command, char*  parameters) 
{
    char entered[256];
    cin >> entered;
    
    bool space = false; // Нужно для различения названия команды и её операндов.
    int j=0,k=0;
    for(int i = 0; entered[i]; i++) 
    {
        if(!space && entered[i] == ' ') 
              space = true;
        else 
            if(!space)// Пока что название команды
                command[j++]= entered[i];
            else 
                parameters[k++]= entered[i];
    }
    parameters[k]=0;
    command[j]=0;
}
 
int main() 
{
    char command[256];
    char parameters[256];
 
    read_command(command, parameters); // Чтение ввода с терминала
 
}
0
ExeTwezz
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 16
Завершенные тесты: 1
06.04.2014, 12:38  [ТС] #7
Спасибо, но у второго аргумента execve() должен быть тип char* const*:
error: cannot convert 'char*' to 'char* const*' for argument '2' to 'int execve(const char*, char* const*, char* const*)'
0
ExeTwezz
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 16
Завершенные тесты: 1
10.04.2014, 19:45  [ТС] #8
Всем спасибо за ответы. Я решил перейти на C, так как я его легче воспринимаю. Написал оболочку на примере Hiran Ramankutty.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2014, 19:45
Привет! Вот еще темы с ответами:

Разделить строку на слова - C++
Есть некая строка со словами: string stroka; И есть некоторая функция перегрузки: istream &amp; operator &gt;&gt;(istream * os) { ...

Разделить строку на слова - C++
I. Данный указатель на строку “Ala ma kota, a kot ma ale”. Напишите программу, которая будет выполнять такие функции: • разделит строку...

Разделить строку на символы - C++
Вводится какая то строка, нужно каждый символ разделить на отдельные элементы. Это можно сделать через char*, только не могу вспомнить как....

Разделить строку на слова. - C++
В общем есть строка, и ее надо разбить на массив строк чтобы каждое слово было в ствоей строке. Знаю что надо пользоваться strstr но в...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.04.2014, 19:45
Ответ Создать тему
Опции темы

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