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

Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.80
11buratino11
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 6
07.07.2011, 21:32     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции #1
всем доброго времени суток. суть вопроса в следующем: необходимо выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции. Пытаюсь сделать это так (для начала хотел выделить хоть одну подстроку):

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
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
int main()
{
    int n, m, i, j, k;
    char ch;
    string str="";
    char tmp[]="";
    cout<<"Enter size:"<<endl;
    cin>>n>>m;
    cout<<"Enter table:\n";
    for(i=0;i<n;i++)
    {
             fflush(stdin);       
             getline(cin, str);              
             for( j=0; j<=str.length(); j++ )
             {
                     if (str[j]!='\t') tmp[j]=str[j];
                     else
                        break;
              }
    }          
    cout<<tmp<<"  "<<strlen(tmp)<<endl;
    cin>>n;
}
Ввод: размер 1 на 1
Hello world
По идее должно вывести Hello и длину подстроки, но выводит HelloФкакиетокряказяблы и длину строки постоянно 20, при чем символ "Ф" также выводит постоянно. Можете подсказать, что я делаю неправильно?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2011, 21:32     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции
Посмотрите здесь:

C++ Вывести номера позиций начала введенной подстроки в введенной строке
C++ Выделить последнее слово из введенной строки
C++ Внести слова, разделенные пробелом, из строки в массив
C++ Найдите во введенной строке все подстроки вида «ХХ.ХХХ.Х», где Х – цифра, и выведите их на экран
Во введенной пользователем строке удалите все пробелы в начале и конце строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.07.2011, 21:58     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции #2
вы на каком языке пишите Си или С++ ? у вас адская мешанина к тому же неправильная
вот разбиение строки на токены на С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <sstream>
 
int main()
{
    std::string str;
    std::cout << "Enter sting: ";
    std::getline(std::cin, str, '\n');
    std::cin.clear();
    std::stringstream ss(str);
    while(ss >> str)
        std::cout << str << '\n';
    std::getchar();
    return 0;
}
на Си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
 
int main()
{
    printf("Enter string: ");
    char str[80];
    fgets(str, 80, stdin);
    fflush(stdin);
    char* ptr = strtok(str, " \t\n");
    for (; ptr != NULL; ptr = strtok(NULL, " \t\n"))
    {
        printf("%s\n", ptr);
    }
    getchar();
    return 0;
}
11buratino11
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 6
07.07.2011, 22:37  [ТС]     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции #3
пишу (учусь писать)) на с++
спасибо за приведенный пример кода, но он мне не совсем понятен и по моему у меня немного не тот случай, так как в этом коде в качестве разделителя может быть не только знак табуляции, но и пробел, и к тому же мне необходимо подстроки где-то хранить, а не просто выводить на экран, а в этом примере, насколько я понял, строка используется как будто она поток ввода/вывода
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
07.07.2011, 22:49     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции #4
Цитата Сообщение от 11buratino11 Посмотреть сообщение
необходимо подстроки где-то хранить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <sstream>
#include <vector>
 
int main()
{
    std::string str;
    std::vector<std::string> vstr;
    std::vector<std::string>::iterator i;
 
    std::cout << "Enter sting: ";
    std::getline(std::cin, str, '\n');
    std::cin.clear();
    std::stringstream ss(str);
    while(ss >> str)
        vstr.push_back(str);
    for (i = vstr.begin(); i != vstr.end(); ++i)
        std::cout << *i << std::endl;
    std::getchar();
    return 0;
}
Добавлено через 6 минут
Цитата Сообщение от 11buratino11 Посмотреть сообщение
так как в этом коде в качестве разделителя может быть не только знак табуляции, но и пробел,
Уберите пробел из второго параметра strtok
11buratino11
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 6
07.07.2011, 23:33  [ТС]     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции #5
спасибо вам за совет, я что-то не подумал про вектор. но боюсь у меня теперь возникнет больше проблем... сглупил я , надо было наверное полностью выложить суть проблемы...
В общем пользователь вводит не просто строку, а таблицу
Sample Input
Код
3		4
12		        =C2	        3	        'Sample
=A1+B1*C1/5	=A2*B1	=B3-C3	'Spread
'Test                 	=4-3	5	                'Sheet
в которой соответственно может быть текст(знак "), формула(=), число или ничего, и вот эту таблицу и надо, так сказать, парсить. Я думал сначала "вытаскивать" каждую ячейку, разделенную табуляцией, а потом уже брать из нее первый символ и в зависимости от него, работать с ней дальше. Исходя из этого еще вопрос:
к первому символу обращаться так
C++
1
2
3
4
5
6
7
8
.....
std::string tmp;
char ch;
.....
tmp=vstr[i];
.....
ch=tmp[0];
......
или есть более простой способ?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
07.07.2011, 23:44     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции #6
Цитата Сообщение от 11buratino11 Посмотреть сообщение
или есть более простой способ?
C++
1
ch = *vstr[i].begin();
Добавлено через 1 минуту
или
C++
1
ch = vstr[i][0];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2011, 23:51     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции
Еще ссылки по теме:

C++ Программа для подсчета пробелов во введенной пользователем строке
Посчитать длину введенной пользователем строки C++
Извлечение данных из введенной пользователем строки C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.07.2011, 23:51     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
11buratino11, так подойдёт?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <vector>
 
int main(){
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ){
        std::istringstream ist(str);
        std::vector<std::string> tokens;
        while ( std::getline(ist, str, '\t') )
            if ( ! str.empty() ) // если таблица может содержать пустые ячейки и одна ячейка отделена от другой точно одним '\t', эту проверку нужно убрать
                tokens.push_back(str);
        
        std::cout << "Separated by tokens:" << std::endl;
        std::copy(tokens.begin(), tokens.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    }
    
    return 0;
}
Код
$ ./by_tokens
String: bla bla         one two three   abc = def
Separated by tokens:
bla bla
one two three
abc = def
String:
Yandex
Объявления
07.07.2011, 23:51     Выделить из строки, введенной пользователем, подстроки, разделенные знаком табуляции
Ответ Создать тему
Опции темы

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