2010-02-09 8 views
1

je suis en train de créer une carte de mot ==> drow, comme polindrom ... le problème est au niveau final à "strtok" ... d'abord je l'ai divisé, puis dans la suite appelez en faisant strtok (NULL, ""); ça marche bien. le problème est quand j'ajouter la deuxième chaîne « poly_buffer » ... semble que cela fonctionne sur elle ....C++ strtok problème

#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); 
} 

ce que je fais mal?

+0

Le mot que vous cherchez est "palindrome". –

+0

Quelle est la boucle infinie dans la dernière ligne de 'main'? Aussi, qui libère la mémoire réservée par ces «nouveaux»? – Manuel

Répondre

4

les deux appels strtok

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

interfèrent les uns avec les autres, vous devez les traiter un par un - vous ne pouvez pas les en même temps, car ils partagent la mémoire statique dans la bibliothèque d'exécution. à-dire d'abord faire strtok (buffer, " ") strtok (NULL," ") jusqu'à la fin, puis faire strtok (poly_buffer,"") ///

voir référence exécution doc pour strtok

+0

merci beaucoup, je vais le faire alors – kaycee

+0

@kayce - Anders est juste, vous devez utiliser une version rentrante de strtok comme strtok_r (GCC) ou strtok_s (VC++). Ou mieux encore, faites comme Neil dit et utilisez les alternatives supérieures que C++ a à offrir – Manuel

2

Si vous utilisez C++, pourquoi diable utiliseriez-vous strtok? Utilisez un stringstream à tokenise et un vecteur pour contenir les mots:

#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; 
    } 
} 
+0

Je sais qu'il ya une meilleure façon, mais je teste juste le cstring – kaycee

1

De la page man pour strtok, strtok_r:

"Avoid using these functions."