Avatar billede wiraz Nybegynder
08. juli 2005 - 23:00 Der er 12 kommentarer og
1 løsning

bug i strcat?

Hejsa,

jeg oplever en, i mine øjne temmelig styg fejl i forbindelse med brug af strcat. Nedenstående funktion løber igennem et array indeholdende filtyper og returnerer en boolean der indikerer om det angivede filnavn er en gyldig filtype.

bool tag::acceptedFiletype(char *filename, std::string *filetypes, int filetypes_length) {
  for(int i=1;i<=filetypes_length;i++) { // loop through all accecpted filetypes and see if filename matches any of them
    std::cout << "i: " << i << std::endl;
    char filetype[] = ".";
    strcat(filetype,(*filetypes).c_str());
    std::cout << "i: " << i << "  filetype: " << filetype << std::endl;
    if(strstr(filename,filetype) != NULL)
      return true;

    filetypes++;
  }

  return false; // no match
}

Den første cout printer "i: 0" til skærmen som forventet, men ved den anden cout går det helt galt: Her er i sat til 13168!? (hvilket betyder at løkken kun gennemløbes en gang, da i > filetypes_length). Ændringen af i sker ved kaldet til strcat, som åbenbart har indvirkning på i.
Er det et kendt problem jeg oplever med strcat? Jeg indrømmer gerne at jeg er nybegynder i C/C++, men synes dog alligevel at dette virker temmelig suspekt...
Avatar billede wiraz Nybegynder
08. juli 2005 - 23:03 #1
Den første cout printer selvfølgelig 1 og ikke 0, som jeg skriver ovenfor... :)
Avatar billede arne_v Ekspert
08. juli 2005 - 23:12 #2
prøv at ændre

char filetype[] = ".";

til

char filetype[1000] = ".";
Avatar billede arne_v Ekspert
08. juli 2005 - 23:13 #3
char filetype[] = ".";

allokerer kun plads til et tegn og en terminerende nul byte

så strcat laver en grim memory overskrivning
Avatar billede wiraz Nybegynder
08. juli 2005 - 23:28 #4
ahh... det hjalp!

jeg takker og bukker mange gange! :)
Avatar billede wiraz Nybegynder
08. juli 2005 - 23:28 #5
lægger du lige et svar?
Avatar billede arne_v Ekspert
08. juli 2005 - 23:30 #6
kommer her
Avatar billede wiraz Nybegynder
08. juli 2005 - 23:34 #7
Findes der egentlig en smartere måde at lave en konkatenering af to char arrays? Med smartere mener jeg en måde hvor man ender op med et char array med nøjagtig den nødvendige størrelse og ikke som i ovenstående tilfælde, hvor der reserveres plads til 1000 chars (og man eksempelvis kun har behov for 5).
Avatar billede arne_v Ekspert
08. juli 2005 - 23:37 #8
du kunne allokere det dynamisk

char *filetype = new char[filetypes->length()+1];

men så skal du huske at deallokere
Avatar billede arne_v Ekspert
08. juli 2005 - 23:37 #9
men variablen må vel være helt unødvendig !?
Avatar billede arne_v Ekspert
08. juli 2005 - 23:39 #10
bool tag::acceptedFiletype(char *filename, std::string *filetypes, int filetypes_length) {
    for(int i=0;i<filetypes_length;i++) {
        std::cout << "i: " << i << "  filetype: " << filetype << std::endl;
        if(strstr(filename,filetypes[i].c_str()) != NULL) return true;
    }
    return false;
}

bør vel gøre det samme
Avatar billede arne_v Ekspert
08. juli 2005 - 23:40 #11
nej - jeg glemte punktummet
Avatar billede arne_v Ekspert
08. juli 2005 - 23:42 #12
bool tag::acceptedFiletype(char *filename, std::string *filetypes, int filetypes_length) {
    for(int i=0;i<filetypes_length;i++) {
        std::cout << "i: " << i << "  filetype: " << filetype << std::endl;
        if(strstr(filename,("." + filetypes[i]).c_str()) != NULL) return true;
    }
    return false;
}
Avatar billede wiraz Nybegynder
08. juli 2005 - 23:46 #13
Ja, man kan selvfølgelig allokere det dynamisk som du skriver - tænkte jeg ikke lige på.

Variablen er unødvendig, ja. Det var udelukkende af debug-hensyn (så jeg kunne skrive den ud på skærmen) at jeg indførte den.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester