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

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

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

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

10.12.2010, 15:59. Просмотров 1115. Ответов 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;
              }
              
                   
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
10.12.2010, 16:06     strtok в си++ не хочет работать #2
strtok здесь не нужен(к тому же вы используете его неправильно) используйте sscanf.
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
10.12.2010, 16:37  [ТС]     strtok в си++ не хочет работать #3
А не могли бы вы сказать, что именно неправильно?

Добавлено через 29 минут
народ, кто-нибудь знает, почему этот код не работает как положено
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
10.12.2010, 18:30     strtok в си++ не хочет работать #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;
              }
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
10.12.2010, 18:30     strtok в си++ не хочет работать #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);
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
10.12.2010, 18:36     strtok в си++ не хочет работать #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;
              }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2010, 17:54     strtok в си++ не хочет работать
Еще ссылки по теме:

Почему не хочет работать код? C++
Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok C++
C++ Макрос не хочет работать
Не хочет работать C++
C++ Программа не хочет работать с русскими буквами

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

Или воспользуйтесь поиском по форуму:
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
11.12.2010, 17:54  [ТС]     strtok в си++ не хочет работать #7
Всем спасибо, заработало
под массив, хранящий место пришлось выделить на один элемент больше, иначе некуда было ему класть символ конца строки и он мне выводил место вместе с ником без пробела
Yandex
Объявления
11.12.2010, 17:54     strtok в си++ не хочет работать
Ответ Создать тему
Опции темы

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