http://www.pronix.de -> Forum -> C-Programmieren -> Code-Schnipsel

Unterseiten

Code-Schnipsel

Moderatoren: broesel, Martin Conrad, Patrick

Thema: Wenn bei Prorgrammaufruf nicht genau 2 Parameter angegeben werden?

  • (nur registrierte Mitglieder)
HAllo!
Ich hab eine Frage.
Ich muss ein Programm schreiben bei dem 2 Parameter angegeben werden sollen.

Doch falls nicht genau zwei Parameter angegeben werden, soll
eine Meldung erscheinen, die die Verwendung des Programms erläutert.
Sagen wir man muss Zähler und Nenner eingeben aber gibt nur den Zähler als Zahl ein und den Nenner als ein Sonderzeichen oder so etwas ähnlichem.
Ich habe keine Ahnung, wie ich das definieren soll.
Ich dachte mir vielleicht so:

if(x OR y NOT(Num))
{
printf ("Dieses Programm kürzt Brüche");
}
Irgendwie so! Ich meine damit wenn x oder y keine Zahl ist, kommt halt diese Fehlermeldung.
Eine bessere Idee hatte ich nicht.
Aber ich weiß nicht ob das so geht.
 
Hi,

eine Möglichkeit von Vielen. Mit Abstand nicht die performanteste - eher typisch für mich alles mit ner regex zu machen:


int is_integer(char *str)
{
	regex_t	reg;

	if(str == NULL)return 0;
	regcomp(&reg, "^([0-9]+)$", REG_EXTENDED | REG_NOSUB);
	if(regexec(&reg, str, 0, 0, 0))return 0;
	regfree(&reg);
	return 1;
}


Bis denne

Martin

--
0xC0FFEE

 
Neben der tollen Lösung von Martin könnten noch folgende zwei Threads für Dich interessant sein (wenn's denn Standard C sein muss):

http://www.pronix.de/modules/newbb/viewtopic.php?topic_id=821&forum=2
http://www.pronix.de/modules/newbb/viewtopic.php?topic_id=693&forum=2

Viele Grüße
Jürgen
 
Hi Jürgen,

das ist aber schon ein wenig "mit Kanonen auf Spatzen".
Da sprach der webfuzzie, der sowieso erst mal auf alles Ungeprüfte ne regex hetzt Grafik: Smilie Zwinker

Wer nicht seinen Objektcode aufpusten möchte ist wahrscheinlich mit sowas besser beraten:


int is_integer(char *str)
{
	unsigned int a, len = 0;

	if(str == NULL)return 0;
	len = strlen(str);
	if(!(len))return 0;

	for(a = 0; < len; a++)
	{
		if( (str[a]) < '0') || (str[a] > '9') )return 0;
	}
	return 1;
}


Guten Rutsch, falls wir nicht vorher voneinander hören!

Martin
P.S. Das Hitzeproblem scheine ich im Griff zu haben. Es läuft grad seit 3 Stunden ein CPU Stress Test, also gehts bald weiter Grafik: Smilie Gluecklich

--
0xC0FFEE

 
Ist ja witzig, ich habe gerade gestern (also heute morgen *hust*) eine Funktion geschrieben, die überprüft ob ein String eine Integer enthält:


#include <ctype.h>

#define true  1
#define false 0

int
is_int(const char *_s) {
        unsigned int i = 0;

        if(_s == NULL) return(false);
        if((_s[0] == '+') || (_s[0] == '-')) i++;

        while(_s[i] != '\0')
                if(!isdigit(_s[i++]))
                        return(false);

        return(true);
}


Damit hat man den strlen() (und eine lokale Variable) gespart und muss nicht zweimal durch den String iterieren (einmal mit strlen(), einmal in is_int() selbst). Das zweite if-Statement prüft auf ein Vorzeichen (atoi() akzeptiert Vorzeichen).
isdigit() ist übrigens keine Funktion, sondern ein Makro; man verliert also keine Zeit an einen Funktionsaufruf.

Wer aufgepasst hat wird feststellen, dass diese Funktion die Strings "+" und "-" zu ints erklärt. Das ist gut, denn atoi() liefert für "+" und "-" eine Null.

Wahrscheinlich kann man es noch besser lösen (das zweite if-Statement kann gegen einen arithmetischen Ausdruck ersetzt werden, die CPU macht dann weniger Fehler bei den Sprungberechnungen), aber ich glaube mit dieser Lösung ist man schon nah am Optimum.

*klugscheiss* :D
Gruss
Philip

PS: Diese Funktion findet nicht heraus, ob der angegebene String den darstellbaren Bereich von int sprengt. atoi() liefert dann INT_MAX (wird in <limits.h> definiert), was sich gut als Fehlerkondition eignet. Wer es genauer haben möchte, verwendet strtol().

--
The C Programming Quiz (externer link) - bitte Fragen einreichen :)

 
  • (nur registrierte Mitglieder)