Frage zu strtok() - Threadsicher?



  • Lol stimmt, das ist der offensichtlichere Weg wie man da Probleme bekommen kann 😃



  • Ok jetzt habe ich mit der strtok_s Funktion noch das Problem das es ab Windows Vista nicht funktioniert.

    strtok_s

    <string.h>

    Compatibility

    Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

    Gibt es irgendeine alternative für diese Funktion oder kann ich die Funktion irgendwie "nachschreiben"?



  • strtok_s() ist eine Funktion der CRT, die funktioniert überall wo die CRT läuft, also ganz sicher auch auf Vista und 7 😉



  • Warum bekomme ich dann die folgenden Fehlermeldungen:

    C:\Users\0x02\Programme und Source\strtok_s\project\main.c(21) : warning C4013: 'strtok_s' undefined; assuming extern returning int
    
    Linking...
    main.obj : error LNK2001: unresolved external symbol _strtok_s
    Debug/project.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
    


  • Code:

    #include <string.h>
    #include <stdio.h>
    
    char string1[] =
        "A string\tof ,,tokens\nand some  more tokens";
    char string2[] =
        "Another string\n\tparsed at the same time.";
    char seps[]   = " ,\t\n";
    char *token1,
         *token2,
         *next_token1,
         *next_token2;
    
    int main( void )
    {
        printf( "Tokens:\n" );
    
        // Establish string and get the first token: 
        token1 = strtok_s( string1, seps, &next_token1);
        token2 = strtok_s ( string2, seps, &next_token2);
    
        // While there are tokens in "string1" or "string2"
        while ((token1 != NULL) || (token2 != NULL))
        {
            // Get next token:
            if (token1 != NULL)
            {
                printf( " %s\n", token1 );
                token1 = strtok_s( NULL, seps, &next_token1);
            }
            if (token2 != NULL)
            {
                printf("        %s\n", token2 );
                token2 = strtok_s (NULL, seps, &next_token2); 
            }
        }
    }
    


  • Also bei mir (Visual Studio 2010) kompiliert das sowohl als C++ als auch als reines C ohne Probleme...



  • strtok_s gehört nicht zum C Standard, es ist eine Erweiterung von neueren MS-VC.
    Du verwendest eine Entwicklungsumgebung, die diese Funktion nicht unter diesem Namen anbietet, der Linker kann also den passenden Code nicht finden und genau das sagt er dir.



  • Der Fehlermeldung nach verwendet er eindeutig Visual C++. Es kann sich also eigentlich nur um eine uralte Version oder um ein Konfigurationsproblem handeln...



  • Ok war doch wohl eine etwas ältere Version von Visual C++ daran hats gelegen.
    Lade mir gerade jetzt gerade das Visual Studio C++ 2010 Pro. herunter.
    Muss irgendwas groß am Code geändert werden wenn ich von der alten Version auf die neuste Umsteige?



  • nein



  • Doch.
    Neuere VC haben standardmäßig Unicode eingeschaltet, ebenso das nichtstatische Linken. Mehr dazu gibt es beim MFC Forum.
    Außerdem ist die "frei" runterladbare Pro Version zeitlich in ihrer Verwendung begrenzt, ich glaube 90 Tage.



  • Wutz schrieb:

    Neuere VC haben standardmäßig Unicode eingeschaltet.

    Also bei einem neuen leeren Projekt ist bei mir kein Unicode eingeschaltet..



  • Doch.
    Sobald du in dein leeres Projekt eine .c Datei einfügst, steht unter Konfigurationseigenschaften/Allgemein/Zeichensatz "Unicode-Zeichensatz verwenden".
    Glaub mir, diese "Portierungseigenart" zw. älteren und neueren VC gehört zu den Tops.



  • Deswegen muss aber doch nichts

    0x02 schrieb:

    groß am Code geändert werden



  • Ach nein?
    Und Stringliterale? Ich habe mal gehört, dass diese in C Programmen häufiger vorkommen sollen.



  • Und? Wo ist das Problem, das Projekt mit einem Häkchen auf Multibyte umzukonfigurieren? Es war ja offensichtlich bis zu diesem Zeitpunkt auch kein Unicode-Projekt ...



  • Abgesehen davon wird, wenn er das Projekt konvertiert, dieses Häkchen richtig übernommen werden 😉



  • Ferner erwartet strtok_s keinen LPTSTR oder sonstige auf TCHAR aufbauende Typen und ist von der ganzen Problematik nicht betroffen.



  • Naja, das Projekt wird vielleicht aus mehr als strtok_s bestehen ...



  • Der vom Threadersteller gepostete Code enthielt nichts, was in diesem Zusammenhang kritisch wäre.

    Wenn es darum geht, ob es möglich ist, Code zu schreiben, der abhängig von bestimmten Projekteinstellungen kompilieren oder nicht kompilieren kann: Das ist der Fall. Ich halte das allerdings für keine sonderlich profunde Erkenntnis.


Anmelden zum Antworten