Почему моя строка по-разному анализируется через strtok в Windows и Linux? - PullRequest
3 голосов
/ 27 сентября 2010

В моей программе я режу свой полукокр * с помощью strtok. Когда я проверяю в Windows, он обрезается так, как я хочу, но когда я делаю то же самое в Linux, он делает это неправильно.

Пример:

Windows

  • мой символ * (строка): "1,21-344-32, блабла"
  • в первый раз, когда я делаю strtok, я получаю "1"
  • во второй раз получаю «21-344-32»

Linux:

  • мой символ * (строка): «1,21-344-32, блабла»
  • в первый раз, когда я делаю strtok, я получаю "1"
  • во второй раз получаю "2"

код

Result FileReader::InitRead (Manager* mngr, char* pfileName, ofstream &ResultFile)//add /*Manager* mng,*/ + use for: vehicle init
{
     FILE *pfile;
     char fileName[50],line[2000], *word= NULL,*str1=NULL,*str2=NULL,*str3=NULL, *str4=NULL, *str5=NULL, *str6=NULL;
     int wcount=0,lcount=0;
     Vehicle::Vehicle_Type vecEnm = Vehicle::InvalidCarEm;
     bool stop = false;
     string check;

     strcpy(fileName,pfileName);

     if((pfile = fopen(fileName, "r")) == NULL) 
     {
         ResultFile<<"Error Opening vehicles init file, May not exist.\n";
         return Fail;
     }
     else
     { 
      while( fgets(line, sizeof(line), pfile) != NULL ) 
      {
       lcount++;
       wcount=0;
       check.assign(line);
       if(check.size()!=0){
       word = strtok (line,",");
       if ((word[0] != '#') &&  (word[0] != '\r') && (strcmp(line,"\n") != 0))
       {
           wcount++;
           str1 = word;
           vecEnm = (Vehicle::Vehicle_Type)(atoi(str1));
           while ((word != NULL) &&  (wcount < 7) && (!stop))
           {
                 wcount ++;
                 word = strtok (NULL, ",");

                 switch (wcount)
                 {
                        case 2: str2 = word;
                              break;
                        case 3: str3 = word;
                              break;
                        case 4: str4 = word;
                              break;
                        case 5: str5 = word;
                              if ((vecEnm < Vehicle::PlaneEm) || (vecEnm == Vehicle::InvalidCarEm))
                                    stop=true;
                              break;
                        case 6: str6 = word;
                              break;
                        default:break;
                 }
            }

            mngr->TranslateVecInit(vecEnm,str2,str3,str4,str5,str6,ResultFile);

           }//while - line not finished
       }
       str1=str2=str3=str4=str5=str6=NULL;
       stop=false;

       }//reads next line
       fclose(pfile); 
       }
 return Success;
}

Ответы [ 2 ]

1 голос
/ 17 марта 2017

Я сталкиваюсь с той же проблемой в C. Мой код отлично работал в Windows, но я продолжал получать ошибку, используя strtok() в Linux.Я просто забыл включить string.h:

#include <string.h>
1 голос
/ 14 октября 2010

Я не смог обнаружить ничего плохого в вашем коде, но я настоятельно рекомендую использовать strtok_r () вместо strtok (). Я чувствую, что strtok следует сделать устаревшим, это небезопасно в среде MT. Также я думаю, что strtok_r поможет вам легко найти ошибку, так как у нее есть другой параметр для отслеживания процесса разбора, поэтому легко найти, что не так: http://www.mkssoftware.com/docs/man3/strtok_r.3.asp

...