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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
#1

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

10.12.2010, 15:59. Просмотров 1138. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2010, 15:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос strtok в си++ не хочет работать (C++):

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

Не хочет работать - C++
#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 =...

не хочет работать код(((( - C++
#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; ...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
10.12.2010, 16:06 #2
strtok здесь не нужен(к тому же вы используете его неправильно) используйте sscanf.
1
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
10.12.2010, 16:37  [ТС] #3
А не могли бы вы сказать, что именно неправильно?

Добавлено через 29 минут
народ, кто-нибудь знает, почему этот код не работает как положено
0
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
10.12.2010, 18:30 #4
Он работает как положено, а код, который делает то, что тебе нужно, выглядит как-то так:
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
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
10.12.2010, 18:30 #5
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
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
10.12.2010, 18:36 #6
Цитата Сообщение от Напильнег Посмотреть сообщение
код, который делает то, что тебе нужно, выглядит как-то так:
Но он портит строку 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
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
11.12.2010, 17:54  [ТС] #7
Всем спасибо, заработало
под массив, хранящий место пришлось выделить на один элемент больше, иначе некуда было ему класть символ конца строки и он мне выводил место вместе с ником без пробела
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2010, 17:54
Привет! Вот еще темы с ответами:

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

Почему не хочет работать код? - C++
Если динамическое выделение памяти, то работать не хочет. #include &lt;iostream&gt; #include &lt;cstdio&gt; using namespace std; int main()...

Не хочет работать cin.getline - C++
cin.getline(comp.processor, 50); Должно работать до энтера (в другом вижуале нормально работает), а в 2015 не работает без трех...

Посогите с прогой работать не хочет - C++
#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,...


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

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

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