2016-04-04 6 views
-1

// Ein einfaches Programm, das Leerzeichen und Komma als Trennzeichen (separate Zeichen)strtrok_s Funktion braucht nicht zwei Argumente

// und druckt jede Teilkette-die, jeder Token-auf seine eigene Linie interpretiert:

#include "stdafx" 
#include <iostream> 
#include <cstring> 
using namespace std; 

int main(){ 

char the_string[81], *p; 

cout << "Input a string to parse: "; 
cin.getline(the_string, 81); 
p = strtok_s(the_string, ", "); 
while (p != nullptr) { 
cout << p << endl; 
p = strtok_s(nullptr, ", "); 

} 


return 0; 

}

Dies sind die Probleme, es gibt mir Fehler 1 Fehler C2660: 'strtok_s': Funktion nimmt nicht 2 Argumente

IntelliSense: zu wenige Argumente in Funktionsaufruf

+0

Bitte lesen Sie [die Dokumentation] (https://msdn.microsoft.com/en-us/library/ftsafwz3.aspx) für die Funktion 'strtok_s' und beheben Sie Ihren Code gemäß der Dokumentation. Sie übergeben nicht alle erforderlichen Argumente an die Funktion. – Jens

+0

Wissen Sie, wie Sie die Dokumente nachschlagen können? Ich benutze den Google-Suchbegriff 'site: msdn.microsoft.com strtok_s' und komme zu ['strtok_s()'] (https://msdn.microsoft.com/en-us/library/ftsafwz3.aspx) für VS 2015. Die Beobachtung in Ihrem Fragetitel ist richtig: 'strtok_s()' nimmt nicht zwei Argumente (obwohl '' strtok() '' 'tut - aber es gibt gute Gründe,' strtok() 'nicht zu verwenden). –

+0

Ich benutze strtok(), aber es dosent mir das Programm laufen lassen seine sagt es sicherer strtok_s() zu verwenden – zezhawk22

Antwort

1

Der Compiler empfehlen nur die Funktionen Safer CRT, und es gibt Ihnen auch Anweisungen für die Warnungen ausschalten, wenn Sie wirklich die ursprüngliche strtok Funktion verwenden mögen:

warning C4996: 'strtok': This function or variable may be unsafe. Consider 
using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNING 

Nur hinzufügen _CRT_SECURE_NO_WARNING als Preprocessor in den Projekteinstellungen definieren oder auf der Oberseite Ihrer stdafx.h Datei hinzufügen #define _CRT_SECURE_NO_WARNING 1

Siehe Security Features in the CRT

Sie sind eindeutig sehr neu in C/C++, Sie brauchen sich also noch keine Gedanken um dieses Detail zu machen. Der Grund für diese Warnung liegt darin, dass viele lange C-String-Bibliotheksfunktionen, die auf Kernighan & Ritchie's original language zurückgehen, einige inhärente Sicherheitsprobleme in der modernen Welt der Malware aufweisen. Daher sollte jede Produktionsanwendung die Bevorzugung der "Safer CRT" -Versionen vermeiden.

Insbesondere strtok funktioniert mit internen versteckten Zustand in der Bibliothek, die manchmal ausgenutzt werden können, um Sicherheitsprobleme in Parsern zu erstellen. anstelle der versteckten internen Variable

char *strtok(char *str, const char *delim); 

Die strtok_s Funktion nimmt einfach eine explizite Kontextvariable für den Staat zu verwenden. Es funktioniert genauso wie strtok in allen anderen Arten.

char *strtok_s(char *strToken, const char *strDelimit, char **context); 

Daher Code tun würde genau das gleiche wie Ihr Buch Probe wie folgt:

#include <iostream> 
#include <cstring> 
using namespace std; 

int main(){ 

char the_string[81], *p; 
char *next_token = nullptr; 

cout << "Input a string to parse: "; 
cin.getline(the_string, 81); 
p = strtok_s(the_string, ", ", &next_token); 
while (p != nullptr) { 
cout << p << endl; 
p = strtok_s(nullptr, ", ", &next_token); 
} 


return 0; 
} 

Weitere Informationen und Geschichte auf der sicheren Nutzung des CRT finden Security Development Lifecycle (SDL) Banned Function Calls

Verwandte Themen