Gå til innhold

Hvirdan hente ut utvalgte tall fra en string i C


Anbefalte innlegg

Videoannonse
Annonse

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 av Oyand
Lenke til kommentar

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

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 av Oyand
Lenke til kommentar

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 av perpers
Lenke til kommentar

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 av perpers
Lenke til kommentar

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 av Lycantrophe
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...