проблема c ++ strtok - PullRequest
       5

проблема c ++ strtok

1 голос
/ 09 февраля 2010

я пытаюсь создать карту слова ==> дроу, как полиндром ... проблема на последнем уровне у "стрток" ... сначала я делю его, затем при последующем вызове при выполнении strtok (NULL, ""); все работает нормально проблема в том, когда я добавляю вторую строку "poly_buffer" ... кажется, это работает на нем ....

#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
#include <string>
using namespace std;

void poly(char *buffer)
{
 char temp;
 for (int i=0; i<=strlen(buffer); i++)
 {
  int word_start = i, word_stop = i;

  while (buffer[i] != 32 && buffer[i] != '\0') { i++; word_stop++; }
  word_stop--;

  //swap chars until the middle of word
  while (word_stop >= word_start)
  {
   //swap the chars
   temp = buffer[word_stop];
   buffer[word_stop] = buffer[word_start];
   buffer[word_start] = temp;
   word_stop--;
   word_start++;
  }
  word_start = i;

 }
}


void main()
{
 FILE *fp;
 char *buffer;
 char *poly_buffer;
 long file_size;
 map<string,string> map_poly;

 fp = fopen("input.txt", "r");

 if (fp == NULL) { fputs("File Error",stderr); exit(1); }

 //get file size
 fseek(fp,1,SEEK_END);
 file_size = ftell(fp);
 rewind(fp);

 //allocate memory
 buffer = new char[file_size+1];
 poly_buffer = new char[file_size+1];

 //get file content into buffer
 fread(buffer,1, file_size,fp);
 strcpy(poly_buffer,buffer);

 buffer[file_size] = '\0';
 poly_buffer[file_size] = '\0';

 poly(buffer);

 buffer = strtok(buffer," ");
 poly_buffer = strtok(poly_buffer," ");

 while (buffer != NULL)
 {
  map_poly[buffer] = poly_buffer;
  printf("%s ==> %s\n", buffer, poly_buffer);
  buffer = strtok(NULL," ");
  poly_buffer = strtok(NULL," ");
 }

 fclose(fp);
 while(1);
}

что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 09 февраля 2010

оба стртока звонят

buffer = strtok(buffer, " ");
poly_buffer = strtok(poly_buffer," ");

мешают друг другу, вам нужно обрабатывать их одну за другой - вы не можете делать их одновременно, потому что они разделяют статическую память в библиотеке времени выполнения. сначала выполните strtok (буфер, "") strtok (NULL, "") до конца, затем выполните strtok (poly_buffer, "") ///

см. Справочный документ по времени выполнения для strtok

2 голосов
/ 09 февраля 2010

Если вы используете C ++, с какой стати вы бы использовали strtok? Используйте строковый поток для токенизации и вектор, содержащий слова:

#include <string>
#include <sstream>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  istringsream is( "here are some words" );
  string word;
  vector <string> words;
  while( is >> word ) {
    words.push_back( word );
  }
  for ( unsigned int i = 0; i < words.size(); i++ ) {
    cout << "word #" << i << " is " << words[i] << endl;
  }
}
1 голос
/ 09 февраля 2010

со страницы руководства для strtok, strtok_r:

"Avoid using these functions."
...