Avatar billede bumle90 Nybegynder
29. januar 2004 - 16:27 Der er 8 kommentarer og
1 løsning

Strenge i C

Hej, jeg har en array af charpointere som opfører sig besynderligt.

Jeg har implementeret funktion SortFileString() som en funktion der tager imod en streng, sorterer i denne og lægger de frasorterede værdier ned i et array af charpointere.
Sorteringen er korrekt hvis jeg udskriver variable inde i funktionen, men når jeg udskriver dem efter funktionen har udført, altså umiddelbart nedeunder ligger der snask i den ene af strengene. Jeg fatter det simpelthen ikke. Hvorfor ændrer strengen sig når jeg printer den fra et andet sted????

Her er den kode jeg har lavet :

void SortFileString(char str[],char* results[])
{

int ctr=0;
char tempstr[255],tempstr1[255],tempstr2[255];
strcpy(tempstr,str);

strcpy(tempstr1,strrchr(tempstr,'|')+1);
tempstr[strlen(str)-strlen(strrchr(str,'.'))]='\0';
strcpy(tempstr2,tempstr);


results[0]=tempstr1;
results[1]=tempstr2;
printf("***%s - %s***\n",results[0],results[1]);
}

int main()
{
char* filestr[5];
SortFileString("filnavn.ext|12345",infoArray);
return 0;
}
Avatar billede bumle90 Nybegynder
29. januar 2004 - 16:30 #1
Rettelse...Sådan her er koden :)

// strenge.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <string.h>
#include <stdio.h>


void SortFileString(char str[],char* results[])
{

int ctr=0;
char tempstr[255],tempstr1[255],tempstr2[255];
strcpy(tempstr,str);

strcpy(tempstr1,strrchr(tempstr,'|')+1);
tempstr[strlen(str)-strlen(strrchr(str,'.'))]='\0';
strcpy(tempstr2,tempstr);


results[0]=tempstr1;
results[1]=tempstr2;
printf("***%s - %s***\n",results[0],results[1]);
}

int main()
{
char* infoArray[5];
SortFileString("filnavn.ext|12345",infoArray);
printf("***%s - %s***\n",infoArray[0],infoArray[1]);
return 0;
}
Avatar billede arne_v Ekspert
29. januar 2004 - 16:39 #2
results[0] og [1] sættes til aqt pege på lokale
variable i SortFileString og er derfor ikke valide udenfor
SortFileString.
Avatar billede bumle90 Nybegynder
29. januar 2004 - 16:42 #3
oki....men det er jo kun den ene der ikke duer...Den anden er okay.
Mit output er følgende

***12345 - filnavn*** <----Udskrift i funktion
***12345 - &#9508;&#8319;&#8597;***    <----Udskrift efter funktion

Hvordan ville en pæn løsning se ud?
Avatar billede bumle90 Nybegynder
29. januar 2004 - 16:43 #4
Ja...de tal der er 3 tegn/symboler som eksperten ikke kan finde ud af at vise åbenbart...
Avatar billede arne_v Ekspert
29. januar 2004 - 16:50 #5
Jo - men de er begge "forkerte".

Du kan ikke stole på nogen af dem.

Med din compiler og i din kode giver det tilfældigvis OK med den
første og fejl med den anden.

Men ændre bare en lille smule i din kode og det kan ændre sig.

Man må aldrig returnere adressen på en lokal variable i en funktion.
Avatar billede bumle90 Nybegynder
29. januar 2004 - 17:00 #6
Okay, det kan jeg godt se du har ret i...
Har du overskud til at lave en funktion det gør det samme på en korrekt måde?
Avatar billede arne_v Ekspert
29. januar 2004 - 17:05 #7
Giv mig 5 minutter.
Avatar billede arne_v Ekspert
29. januar 2004 - 17:07 #8
#include <string.h>
#include <stdio.h>

void SortFileString(char str[],char results[][255])
{
  char tempstr[255];
  strcpy(tempstr,str);
  strcpy(results[0],strrchr(tempstr,'|')+1);
  tempstr[strlen(str)-strlen(strrchr(str,'.'))]='\0';
  strcpy(results[1],tempstr);
}

int main()
{
  char infoArray[2][255];
  SortFileString("filnavn.ext|12345",infoArray);
  printf("***%s - %s***\n",infoArray[0],infoArray[1]);
  return 0;
}
Avatar billede arne_v Ekspert
29. januar 2004 - 17:08 #9
Og et svar
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