String auf Zahlen überprüfen. Wie geht das?

Hallo,

Mach doch mal ein Beispiel wie die Strings aufgebaut sind. Je nach dem ist die Implementation davon dann nämlich wieder anders.

Gruss
Muepe32
 
also das ding ist, das der Anwender über die Linuxkonsole eine option wählt, wie er das Programm starten soll. und die Option lautet -o oder -w=<n> . n steht für eine Zahl.

Um jetzt zu wissen, welche Zahl der Anwender für n gewählt hat muss ich erstmal Zeichen für Zeichen meinen Strings aus argv[ ] überprüfen, ob eine Zahl angegeben wurde und um welche zahl es sich dabei handelt.

Gruß.
 
argv[] enthält eine Liste mit allen Argumenten separiert durch das Leerzeichen. Du kannst daher jeden Eintrag in argv[] prüfen ob er mit -w beginnt und dann den Teil nach dem = als Zahl zu interpretieren versuchen.
 
Hi Muepe32,
mir ist schon klar wie das mit argv[] funktionirt.. das ist aber auch nicht mein problem.
ICh möchte nur wissen, wie ich es schaffe aus dem einzelen String (z.B. argv[4]) Zahlen auslesen kann, falls sich Zahlen in diesem String befinden sollten.

Ich weiss auch, dass ich mit strcmp(argv[4], "-w="); vergleichen kann. aber mein Problem war es, das der Benutzer z.B -w=2, -w=3, -w=7 -w=24 oder -w=1 angeben kann. das läst sich ja sicher nicht so ohne weiteres vergleichen, wenn dynamische Zahlen eingetippt werden können.

Daher meine Frage, wie kann ich diese Zahl nun erst einmal, bevor man vergleicht, auslesen?
Es handelt sich hier um einen optionsparameter, den der Anwender beim Aufruf mit angibt: -w=<n>
Wobei n immer für eine beliebige Zahl steht

Liebe Grüße.
 
Zuletzt bearbeitet:
Hallo Davicito,

Bitte versuche in Zukunft auch mal in der Referenz nachzusehen, gehe da einfach mal alle Funktionen durch, so dass du zumindest mal weisst, welche es alles gibt (oder leg dir ein passendes Buch zu):
sscanf

Gruss
Muepe
 
Buch habe ich ja... und ich google auch im Internet.. so ist das ja nicht! Da ich mir in kurzer Zeit alles selber Beibringen musste und in nur in Java fit bin, brauchte ich schnelle Hilfe, da ich mein Programm in 2. Tagen abliefern muss. Und ich finde C leider nun mal rückschrittlich, wegen den ganzen Zeigern. C ist leider keine robuste Programmierung und bei kleinen Fehlern könnte ich mir die Haare ausreißen.
Beim Buch kommt es auch immer darauf an, wer es geschrieben hat. Nicht alle sind auf Anhieb verstäntlich, oder sind sogar langahtmig, ellenlangen Beispielcode geschrieben, die mann dann eh nicht ganz nachvollziehen kann, weil das betreffende eigene Problem meisst nicht drinn steht.
Und was meinst Du mit Referenz****?
ich hab heute erst mal nach geschaut was es da alles für Funktionen gibt, nur für ein Problem -> puts, fputs, fprintf etc oder strcmp, strncmp, strcasecmp oder strncasecmp. und das für 2 sachen. Wenn ich das für jede sache gemacht hätte, wäre ich nicht soweit gekommen, wie ich nun gerade bin.
Und da lege ich nicht nur auf Bücher oder referenzen. Dafür ist internet und Foren wie diese gemacht worden, schnelles wissen in kurzer Zeit anzueignen.

Sei jetzt nicht sauer... sind halt Ansichtssachen!!

Liebe Grüße.
 
Zuletzt bearbeitet:
Benutz am besten C - Strings:
Das sind array's of char welche mit NULL terminieren.
z.B.:
C:
char str[6] = {'H', 'a', 'l', 'l', 'o', '\0'};
das geht auch folgendermaßen:
C:
char str[6] = "Hallo"; // Die Null wird am Ende von "Hallo" automatisch eingefügt
Wenn du weisst was genau im Array steht, kannst du den String auch so definieren:
C:
char str[] = "Hallo";
auf die einzelnen [Char] - Werte des Strings kannst du über den Index zugreifen
Der Index geht von 0 - (Maxlen - 1) hier also 0 - 5, sollte dir auch aus Java bekannt sein:
z.B gilt
C:
str[0] == 'H'
Jetzt gibt es noch etwas zu wissen:
Die Werte die ein [char] annehmen kann also 'A', 'B' .... werden intern als Zahlen behandelt, ist auch klar, da die einzelnen Zeichen binär gespeichert werden und später erst als Zeichen interpretiert werden.
[char] ist ein Datentyp der Größe 1 Byte und kann damit Werte zw. 0 - 255 annehmen, diese Werte sind für die Ausgabe entsprechend kodiert.
Compile am besten das hier, dann siehst du, was ich meine:
C:
#include <stdio.h>

int main()
{
	int i = 0;
    for(i = 0; i<=255; i++)
            printf("%i: %c\n", i, (char)i);    
    getchar();
    return 0;    
}

Mit dem Wissen sollte nun verständlich sein, wie man aus einem String Zahlen filtern und nach integer übertragen kann.

Alle Zahlen aus str filtern:
C:
void getNums(char str[])
{
	int pos = 0;
	int newpos = 0;
	while (str[pos])
	{
		if (str[pos] >= '0' && str[pos] <= '9')
		{
			str[newpos] = str[pos];
			newpos++;
		}	
		pos++;
	}
	str[newpos] = 0; // Ende des reinen Zahlenstrings markieren
}
Das Ergebnis steht nach dem Aufruf in dem übergebenen String.

Ziffer eines Strings nach Integer umwandeln:
Idee:
C:
int val = 0;
char str[] = "1"
val = str[0] - '0'; // val == 1

Ich hab hier noch ne Methode zum umwandeln einer zusammenhängenden Zahl in einem String:
Wichtig ist halt hier, das eine Zahl wie ein Polynom zu betrachten ist und die einzelnen Koeffizienten des Polynoms sind die in dem String enthaltenen Ziffern:
C:
int strToInt(char* str)
{
	int intVal = 0;
	int pos = 0;
	while (str[pos] != 0)
	{			
		if((str[pos] >= '0') && (str[pos] <= '9'))
		{
			intVal *= 10;
			intVal += str[pos] - '0';
		}
		else
		{
			return intVal;
		}
		pos++;	
	}	
	return intVal;
}
 
Zuletzt bearbeitet:
Hi

um C-Strings gehts doch die ganze Zeit...
Und warum so kompliziert?

Auf sscanf hat Muepe ja schon hingewiesen.
Zuerst das Passende argv suchen, ein int bereithalten und
C++:
sscanf(argv[...],"-w=%d",&...);
So einfach ist das.

Und wenn C keine "robuste" Programmierung ist, was dann? :suspekt:

Zu den ganzen aufgezählten Funktionen und der Referenz:
Damit ist zB die MSDN von Microsoft gemeint, in der jede Funktion ausführlich (und oft mit Beispielen) dokumentiert ist.
Zumindest, für was die Funktion gut ist, was man als Parameter übergeben muss, den Rückgabewert und die benötigte .h-Datei habe ich noch bei jeder gefunden.

@Rückschritt = Pointer: ...ohne worte...
Die Aussage zeigt nur, dass man sich mit Pointern überhaupt nicht auskennt.

Ohne Pointer würde es zB kein Array geben.
Auch Sprachen wie Java verwenden noch immer das "rückschrittliche" Prinzip Adresse+sizeof(...)*Index.

Anderes Beispiel: Das letzte, was ich gestern programmiert habe: Eine (POD-) Struktur mit ... ca. 120 Variablen aus einer Datei einlesen. Datei enthält die Daten in Binärform, le.

Ohne Pointer:
C++:
unsigned int	mystruct_id;
unsigned int	mystruct_version;
...
mystruct_id=fgetc(dat)<<24+fgetc(dat)<<16+fgetc(dat)<<8+fgetc(dat);
mystruct_version=fgetc(dat)<<24+fgetc(dat)<<16+fgetc(dat)<<8+fgetc(dat);
...
120 solche Zeile. Hab ja sonst nichts zu tun...

Mit Pointertechnik:
C++:
typedef struct 
{
    unsigned int	id;
    unsigned int	version;
...
} mystruct, ...;
...
mystruct x;
fread(&x,sizeof(x),1,dat);
Eine Zeile.
Muss man dazu noch was sagen?

Gruß
 

Neue Beiträge

Zurück