Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
30 / 30 / 12
Регистрация: 15.11.2009
Сообщений: 148

strtok в си++ не хочет работать

10.12.2010, 15:59. Показов 1868. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
надо разбить строку на лексеммы, но почему-то не идет дело, не подскажете почему? У меня MasString[] содержит строки:
Best scores:
1) ser4ega 120
2) ser4egaDrunk 110
3) stas 100

Мне нужно выкусить из них место, ник и счет игрока. Но в результате в bsc[j].score и bsc[j].nick оказывается то же, что и в bsc[j].mesto. А в bsc[j].mesto валяется "1)" или "2)" или "3)"

C++
1
2
3
4
5
6
7
8
9
 struct BestScores{char mesto[2]; char nick[16];char score[3];} bsc[3];
              char delim[]=" ";
              for (int j=0;j<3;j++) 
              {cout<<endl<<MasString[j+1]<<endl;
              strcpy(bsc[j].mesto,(strtok(MasString[j+1],delim)));
              strcpy(bsc[j].nick,(strtok(MasString[j+1],delim)));
              strcpy(bsc[j].score,(strtok(MasString[j+1],delim)));
              cout<<MasString[j+1]<<endl;
              }

вся функция выглядит так
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
void showscore(int l,char *nickname)
{
  ifstream inFile;
  inFile.open("file.txt");
  if(!inFile)
  {cerr << "\nCouldn't open file"; return;}
  char next;
  typedef char stri[600];
  stri MasString[4];
  int i=0;
  cin.get();//убирает код из потока cin
  while(true){
              inFile.getline(MasString[i],600); 
              next=inFile.peek();
              cout<<MasString[i]<<endl;
              if (next=='\n') cout<<endl;
              if (next==EOF) break;
              i++;
              
                           
              }
              struct BestScores{char mesto[2]; char nick[16];char score[3];} bsc[3];
              char delim[]=" ";
              for (int j=0;j<3;j++) 
              {cout<<endl<<MasString[j+1]<<endl;
              strcpy(bsc[j].mesto,(strtok(MasString[j+1],delim)));
              strcpy(bsc[j].nick,(strtok(MasString[j+1],delim)));
              strcpy(bsc[j].score,(strtok(MasString[j+1],delim)));
              cout<<MasString[j+1]<<endl;
              }
              
                   
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.12.2010, 15:59
Ответы с готовыми решениями:

Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok
Задача Дана строка слов с разделителями, в данном примере слова с пробелами Нужно, используя функцию strtok, сформировать из этих слов...

Не хочет работать
#include&lt;time.h&gt; #include&lt;stdlib.h&gt; using namespace std; int main() { setlocale(0, &quot;&quot;); int a; int n; int i, j,count =...

не хочет работать код((((
#include &lt;iostream.h&gt; #include &lt;fstream.h&gt; #include &lt;limits.h&gt; #include &lt;locale.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; ...

6
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
10.12.2010, 16:06
strtok здесь не нужен(к тому же вы используете его неправильно) используйте sscanf.
1
30 / 30 / 12
Регистрация: 15.11.2009
Сообщений: 148
10.12.2010, 16:37  [ТС]
А не могли бы вы сказать, что именно неправильно?

Добавлено через 29 минут
народ, кто-нибудь знает, почему этот код не работает как положено
0
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
10.12.2010, 18:30
Он работает как положено, а код, который делает то, что тебе нужно, выглядит как-то так:
C++
1
2
3
4
5
6
7
8
              char delim[]=" ";
              for (int j=0;j<3;j++) 
              {cout<<endl<<MasString[j+1]<<endl;
              strcpy(bsc[j].mesto,(strtok(MasString[j+1],delim)));
              strcpy(bsc[j].nick,(strtok(NULL,delim)));
              strcpy(bsc[j].score,(strtok(NULL,delim)));
              cout<<MasString[j+1]<<endl;
              }
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
10.12.2010, 18:30
C++
1
2
3
4
char s[] = "1) ser4ega 120";
char rank[10];
char nick[10];
char score[10];
Вариант с strtok(s после этого будет испорчена)
C++
1
2
3
strcpy(rank, strtok(s, " "));  
strcpy(nick, strtok(NULL, " "));  
strcpy(score, strtok(NULL, " "));
вариант с sscanf
C++
1
sscanf(s, "%s%s%s", rank, nick, score);
1
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
10.12.2010, 18:36
Цитата Сообщение от Напильнег Посмотреть сообщение
код, который делает то, что тебе нужно, выглядит как-то так:
Но он портит строку MasString[j+1]. Если тебе нужно сохранять строки, то в твоем случае, когда разделитель один, это можно сделать так:

C++
1
2
3
4
5
6
7
8
9
10
              char *p;
              for (int j=0;j<3;j++) 
              {cout<<endl<<MasString[j+1]<<endl;
              strcpy(bsc[j].mesto,(strtok(MasString[j+1]," ")));
              strcpy(bsc[j].nick,(p=strtok(NULL," ")));
              *(p-1)=' ';
              strcpy(bsc[j].score,(p=strtok(NULL," ")));
              *(p-1)=' ';
              cout<<MasString[j+1]<<endl;
              }
1
30 / 30 / 12
Регистрация: 15.11.2009
Сообщений: 148
11.12.2010, 17:54  [ТС]
Всем спасибо, заработало
под массив, хранящий место пришлось выделить на один элемент больше, иначе некуда было ему класть символ конца строки и он мне выводил место вместе с ником без пробела
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2010, 17:54
Помогаю со студенческими работами здесь

Не хочет работать Rand
Здравствуйте, при выполнении лабораторной работы столкнулся с некоторыми трудностями: При запуске программы она доходит до функции ran и...

Не хочет работать htonl
На одной машине собирает проект нормально. На другой выдает ошибку error LNK2001: unresolved external symbol __imp__htonl@4 ругается...

Код не хочет работать
Не могу понять,почему не работает. Помогите пожалуйста #include &lt;string&gt; #include &lt;iostream&gt; using namespace std; enum...

Макрос не хочет работать
Привет всем! У меня не компилируется проект, ошибка, мб кто-то подскажет что не так, т.к. задача простая, но от чего-то у меня она не...

Посогите с прогой работать не хочет
#include &quot;stdafx.h&quot; #include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;conio.h&gt; #include &lt;stdlib.h&gt; void fmas(float q, int n, float a,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru