Avatar billede thomas_fogh Nybegynder
23. januar 2007 - 13:46 Der er 10 kommentarer og
1 løsning

Problem med sscanf

Jeg har et problem med at bruge sscanf på følgende string:

"12.31.2007"

1. Hvis jeg skriver:
  sscanf("%2u.%2u.%4u", &month, &day, &year);
finder den godt nok 3 parametre men 'month' er altid 0.

2. Hvis jeg skriver:
  sscanf("%2u %2u %4u", &month, &day, &year);
finder den kun 1 parameter hvilket er 'month'.


Hvordan får jeg den til at få fat på alle 3?
Avatar billede segmose Nybegynder
23. januar 2007 - 14:01 #1
Mangler du ikke en streng forrest i dit exemple?

svare dit u til typen på month?

For char str[] = "12.31.2007"; Giver
if (3 !=  sscanf(str, "%2u.%2u.%4u", &month, &day, &year))
  printf("Fejl\n");
fejl?
Avatar billede thomas_fogh Nybegynder
23. januar 2007 - 14:07 #2
Jo,
1. sscanf(str, "%2u.%2u.%4u", &month, &day, &year) == 3;

2. sscanf(str, "%2u %2u %4u", &month, &day, &year) == 1;
Avatar billede segmose Nybegynder
23. januar 2007 - 14:32 #3
unsigned int month, day, year;
char str[] = "12.31.2007";
if (3 !=  sscanf(str, "%2u.%2u.%4u", &month, &day, &year))
  printf("Fejl\n");

får jeg de rigtige værdier i month, day & year og ingen fejl.
I punkt 2. mangler der de 2 "." så sscanf får kun læst 1 værdi.
Avatar billede thomas_fogh Nybegynder
23. januar 2007 - 14:39 #4
Ja, det burde du jo også. Jeg forstår ikke hvorfor jeg ikke gør...
Avatar billede segmose Nybegynder
23. januar 2007 - 15:04 #5
ok, lav nyt program med kun de linier i en main og en #include <stdio.h>
mit eneste gæt er at month ikke er unsigned int hos dig.
Avatar billede thomas_fogh Nybegynder
24. januar 2007 - 08:19 #6
month er unsigned char.
Avatar billede thomas_fogh Nybegynder
24. januar 2007 - 08:23 #7
Det kan selvfølgelig også være implementeringen af sscanf som der er noget galt med.
Jeg bruger MinGW (native Win32 version af GCC).
Avatar billede faerch Nybegynder
24. januar 2007 - 09:51 #8
Jeg har også på et tidspunkt bøvlet med GCC og scanf, hvor det kun gik godt hvis jeg læste tilbage i en midlertidig long, og efterfølgende typecastede til rigtig variable. Det er længe siden og det meget sandsynligt at den er opdateret siden.
Min opfordring er at kigge lidt på variabletyper. Prøv med unsigned int, som segmose skriver.
Avatar billede segmose Nybegynder
24. januar 2007 - 17:26 #9
Du skriver : month er unsigned char.
når du bruger %u skal den være en unsigned int, så selvom du gerne vil gemme den i en char hvor den kan være så skal den indlæses som unsigned int, brug evt. en

unsigned int tmp ;

i din sscanf og bagefter

month = tmp;
Avatar billede thomas_fogh Nybegynder
24. januar 2007 - 17:30 #10
Du havde ret... Tak!
Avatar billede faerch Nybegynder
27. januar 2007 - 08:37 #11
P.S. Husk typecasting for at tilfredsstille compileren. I dette tilfælde vil det ikke have nogen praktisk betydning, da compileren nok skal finde ud af det, men det er en god vane altid at typecaste, når man skifter variabeltype. 

month = (unsigned char)tmp;
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