08. juli 2005 - 23:00Der 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...
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).
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.
Synes godt om
Ny brugerNybegynder
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.