2017-05-18 2 views
1

Ich habe Char-Array words, die einige Wörter enthält, und ich muss alle Wörter daraus lesen, ohne Verwendung von String-Bibliotheken (kann strtok nicht verwenden). Hier ist, was ich habe:
Char-Array Wort für Wort ohne String-Funktionen lesen

int wordsCount = 0; 

for (int i = 0; words[i] != '\0'; i++) { 
    if (words[i] == ' ') 
     wordsCount++; 
} 
wordsCount++; 

char word[30]; 
for (int i = 0; i < wordsCount; i++) { 
    sscanf(words, "%s", word); 
} 


Dieser Code nur erstes Wort liest, ich denke, ich etwas sscanf hinzuzufügen, aber ich weiß nicht, was oder gibt es ane andere Methode, mein Ziel zu erreichen?

+1

Haben Sie den Wert von 'wordsCount' nach dem' '' 'überprüft? – Sniper

+1

Was ist, wenn das Wort länger als 30 Zeichen ist? Ihr Programm hat einen Pufferüberlauf. Sie lehren, wie man unsichere und instabile C++ - Programme erstellt? – PaulMcKenzie

+0

Worauf sollten Sie die Wörter lesen? Sicher kein Wort? O_o – George

Antwort

2

Angenommen, Sie möchten die CI/O-API zu halten, können Sie die Verwendung des eingebauten in Leerzeichen-Skipping-Funktionalität von std::scanf machen:

int main() { 
    char const *str = "She sells seashells by the seashore"; 
    char word[30]; 
    unsigned wordLength; 

    for(; std::sscanf(str, " %29s%n", word, &wordLength) == 1; str += wordLength) 
     std::printf("Read word: \"%s\"\n", word); 
} 

Ausgang:

Read word: "She" 
Read word: "sells" 
Read word: "seashells" 
Read word: "by" 
Read word: "the" 
Read word: "seashore"

Natürlich sollten Sie besser auf Fehler prüfen als ich nicht;)

Live demo

0

Sie müssen den Zeiger erhöhen, nachdem Sie lesen:

char word[30]; 
int offset = 0; 
for (int i = 0; i < wordsCount; i++) { 
    sscanf(words, "%s", word); 
    offset += strlen(word) + 1; 
} 

* Oben genannte Code würde nicht wie erwartet funktionieren, wenn Sie words aufeinanderfolgende Leerzeichen enthält. Sie müssen überlegen, wie Sie den Offset korrigieren können.

BTW mit std::string stream und std::string wäre einfacher und sicherer.

std::istringstream iss (words); 
std::string word; 
while(iss >> word) do_something(word); 
+0

nach dem Hinzufügen von 'offset' zu' words' in sscanf es funktioniert, danke –

Verwandte Themen