2012-10-04 2 views
0

je continue à courir dans un problème avec ce code en C++:C++ ne peut pas obtenir l'entrée d'utilisateur pour strtok

#include <stdio.h> 
#include <string.h> 
#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string words[25]; 
    int i = 0; 
    char * word; 
    cout << "Input a phrase, no capital letters please."; 
    char phrase[100] = "this is a phrase"; 
    word = strtok (phrase, " ,."); 

    while (word != NULL) 
    { 
     i++; 
     words[i] = word; 
     cout << words[i] << " "; 
     word = strtok (NULL, " ,.-"); 
     int g = 0; 
    } 
    cout << endl << endl; 

    int g = 0; 
    while (g < i) 
    { 
     g++; 
     char f = words[g].at(0); 
     if ((f == 'a') || (f == 'e') || (f == 'i') || (f == 'o') || (f == 'u') || (f == 'y')) 
     { 
     words[g].append("way"); 
     cout << words[g] << " "; 
     } 
     else 
     { 
     words[g].erase (0,1); 
     cout << words[g] << f << "ay" << " "; 
     } 

    } 
    cout << endl; 
    system("PAUSE"); 
} 

Je veux en fait mon utilisateur de programme pour générer la phrase à mettre en phrase char [100] mais je ne peux pas trouver la syntaxe appropriée pour initier une entrée sans foirer la traduction.

Il s'agit d'un programme qui traduit des phrases en latin BTW.

+1

Quel est le plus petit bout de code cela va causer le problème? Veuillez le poster, afin que nous n'ayons pas à lire tout le programme. En d'autres termes, je pense que votre question est, "Comment puis-je lire l'entrée de l'utilisateur dans un tableau char en C++?" –

+6

Si vous écrivez en C++ et que vous utilisez 'strtok', vous faites certainement quelque chose de mal. – pmr

Répondre

2

Qu'est-ce que vous voulez est:

char phrase[100]; 
fgets(phrase, 100, stdin); 

Bien que, comme indiqué dans les commentaires et autres réponses, vous utilisez des fonctions de chaîne C en C++ et cela est très étrange. Vous ne devriez pas le faire, sauf si vous êtes requis par une cession ou quelque chose.

utiliser:

string input; 
getline(cin, input); 

Pour vous tokenizer pouvez effectuer les opérations suivantes:

string token; 
size_t spacePos; 
... 
while(input.size() != 0) 
{ 
    spacePos = input.find(" "); 
    if(spacePos != npos) 
    { 
     token = input.substr(0, spacePos); 
     input = input.substr(spacePos + 1); 
    } 
    else 
    { 
     token = input; 
     input = ""; 
    } 

    // do token stuff 
} 

Ou, pour sauter tous que le jazz:

string token; 

while(cin >> token) 
{ 
    // Do stuff to token 
    // User exits by pressing ctrl + d, or you add something to break (like if(token == "quit") or if(token == ".")) 
} 
+0

Belle explication et exemple! +1 –

+1

Ty, maintenant que je n'ai finalement rien vissé à corriger: P – CrazyCasta

+0

Votre dernier exemple est légèrement cassé: http://ideone.com/wpO2G (notez l'entrée par rapport à la sortie) - Ceci est Mieux: http://ideone.com/AzWYa –

2

La méthode préférée pour effectuer des E/S de terminal en C++ est les flux. Utilisez std::cin et la fonction std::getline pour lire les chaînes à partir de la sortie d'entrée.

std::string input; 
std::getline(std::cin, input); 

Après cela, vous voudrez probablement se débarrasser de strtok et de regarder ce question pour comprendre comment faire tokenization string en C++.

+0

Votre instruction indique de manière incorrecte que 'getline' est un membre de' std :: string', mais votre code montre correctement que ce n'est pas le cas. –

+0

@BenjaminLindley Merci. Fixé. – pmr