Sssda1 Skrevet 18. januar 2014 Del Skrevet 18. januar 2014 Ok, så jeg har en char *str ="651435.....1468468"; med feks 100 tall. Jeg har lyst til å lagrede tre første sifrene for hvert tiende tall, altså indeks 0,1,2 i en variabel, 10,11,12 i en annen osv. Hvordan gjør jeg dette? Lenke til kommentar
BlueEAGLE Skrevet 19. januar 2014 Del Skrevet 19. januar 2014 Tja, en for-løkke som teller 10 og 10 og legge sammen str[cnt1]*100 + str[cnt1+1]*10 +str[cnt1+2] bør funke. Pass på at du ikke går forbi \0 Lenke til kommentar
Oyand Skrevet 19. januar 2014 Del Skrevet 19. januar 2014 (endret) Hva skal du anvende dette til forresten? Uansett, som BlueEAGLE sa. Også et eksempel: #include <iostream> int main() { const char *str = "123000000045600000007890000000xyz"; int indexOffset = 0; int size = std::strlen(str); for( int i = 0; i < size; i++) { int index = i % 3; if( i != 0 && index == 0 ) { indexOffset += 10; if( index + indexOffset >= size ) break; } std::cout << "Index: " << index << ", Offset: " << indexOffset << ", Value @ index " << index + indexOffset << ": " << str[index + indexOffset] << std::endl; } std::cin.get(); return 0; } Visst du bare skal hente enkle tall fra 0-9 da. Endret 19. januar 2014 av Oyand Lenke til kommentar
Sssda1 Skrevet 19. januar 2014 Forfatter Del Skrevet 19. januar 2014 Takk, skal teste når barna er i seng :-) Det er til en oppgave i projecteuler, skal finne de ti første sifrene i en sum av hundre femti-siffer tall. Er ny i c så fin måte å lære på! Lenke til kommentar
BlueEAGLE Skrevet 19. januar 2014 Del Skrevet 19. januar 2014 Hva skal du anvende dette til forresten? Uansett, som BlueEAGLE sa. Også et eksempel: #include <iostream> int main() { const char *str = "123000000045600000007890000000xyz"; int indexOffset = 0; int size = std::strlen(str); for( int i = 0; i < size; i++) { int index = i % 3; if( i != 0 && index == 0 ) { indexOffset += 10; if( index + indexOffset >= size ) break; } std::cout << "Index: " << index << ", Offset: " << indexOffset << ", Value @ index " << index + indexOffset << ": " << str[index + indexOffset] << std::endl; } std::cin.get(); return 0; } Visst du bare skal hente enkle tall fra 0-9 da. To ting å legge merke til her er at for(i=0; i<size;i+=10) gjør at i hopper med 10 for hver iterasjon. Så lenge i < (size-3) så vil du ha tre gyldige tall å trekke ut. En annen ting er at oppgaven er å lagre de, ikke bare skrive de ut til cout. Da må første siffer ganges med 100, og andre siffer ganges med 10, så legges alle sifferene sammen. Lenke til kommentar
Oyand Skrevet 19. januar 2014 Del Skrevet 19. januar 2014 (endret) En lagrer bare indeksen eller det som er under indeksen i en seperat array. Hoppet på 10 derimot blir feil i indeksering fra 0. Den hopper 10 frem hver tredje gang (med vanlig inkrementering), noe som gir: 0 1 2, 10 11 12, 20 21 22, osv (Her burde en vel kanskje gi 012, 9 10 11, osv.. Glemte litt den da jeg postet.). for(i=0; i<size;i+=10) gjør at i hopper med 10 for hver iterasjon. Så lenge i < (size-3) Hvor kommer de fra? Liker din bedre da. Måtte eksperimentere litt Endret 19. januar 2014 av Oyand Lenke til kommentar
Sssda1 Skrevet 19. januar 2014 Forfatter Del Skrevet 19. januar 2014 (endret) Bruker jeg feil kompilator om jeg ikke får dette til å kompilere? Kompilator: TDM-GCC 4.7.1 64-bit ReleaseBuilding Makefile "C:\Users\Public\Documents\c\Makefile.win" Kjører make... mingw32-make.exe -f "C:\Users\Public\Documents\c\Makefile.win" all gcc.exe -c 13.c -o 13.o -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" 13.c:1:20: fatal error: iostream: No such file or directory compilation terminated. mingw32-make.exe: *** [13.o] Error 1 Compilation failed after 0.27 seconds with errors Endret 19. januar 2014 av perpers Lenke til kommentar
Lycantrophe Skrevet 19. januar 2014 Del Skrevet 19. januar 2014 Det er C++-kode, ikke C. Lenke til kommentar
Sssda1 Skrevet 19. januar 2014 Forfatter Del Skrevet 19. januar 2014 (endret) Det var det ja, var i C jeg lurte på da, jeg kan gjøre det i andre språk. Hvordan parser jeg str[ 0 ] - str[ 2 ] fra char / string til Integer? Dette ble hvertfall feil: char *str = "124124...2421"; // 5000 siffer int i,sum=0; for(i = 0; i < 100; i+=10) { sum = atoi(&str[i])*100+atoi(&str[i+1])*10+atoi(&str[i+2]); printf("%d\n",sum); } Endret 19. januar 2014 av perpers Lenke til kommentar
Lycantrophe Skrevet 19. januar 2014 Del Skrevet 19. januar 2014 (endret) Det er ganske lite C++-spesifikk kode der, det bør være ganske lett å porte den til plain C. atoi tar en hel char array, så du må kopiere den ut i en egen; du kan ikke bruke offsets. char buf[ 4 ]; memcpy( buf, str + i, 3 ); buf[ 3 ] = '\0'; int n = atoi( buf ); edit: men siden du nå jobber med ett og ett siffer og ordner oppgangingen selv kan du også gjøre: int n = ( str[ i ] - '0' ) * 100 + ( str[ i + 1 ] - '0' ) * 10 + ( str[ i + 2 ] - '0' ); Endret 19. januar 2014 av Lycantrophe Lenke til kommentar
Sssda1 Skrevet 19. januar 2014 Forfatter Del Skrevet 19. januar 2014 Der virka det bedre ja! Takk Bør vel lese en C bok ved siden av Lenke til kommentar
zotbar1234 Skrevet 22. januar 2014 Del Skrevet 22. januar 2014 atoi tar en hel char array, så du må kopiere den ut i en egen; du kan ikke bruke offsets. Alternativt kan man bruker sscanf(): char buf[] = "123456783"; for ( size_t pos = 0; pos <= strlen(buf) - 3; pos += 3 ) { int number = 0; assert( sscanf(buf + pos, "%03d", &number ) == 1 ); printf("\tnext number is: %d\n", number); } Lenke til kommentar
Lycantrophe Skrevet 22. januar 2014 Del Skrevet 22. januar 2014 Det er så klart den smarte måten å gjøre det på. Men svaret var mer til hvorfor atoi-koden ikke fungerte. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå