isdigit-Funktion

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
Antworten
Dolphin
Beiträge: 3
Registriert: Sa Okt 11, 2014 5:36 pm

isdigit-Funktion

Beitrag von Dolphin » Sa Okt 11, 2014 5:52 pm

Hallo zusammen!

Ich versuche anhand eueres c-Tutorials mir diese Programmiersprache etwas anzueignen. Das klappt soweit auch relativ gut. Allerdings scheitere ich gerade an der Funktion isdigit. :/
Im Tutorial wird ja gezeigt, wie das Programm aussehen, damit man eine einfache Additon ausführen kann. Jetzt wollte ich mit der isdigit-Funktion das so abändern, dass noch überprüft wird, ob auch Zahlen eingegeben wurden. Nur leider gelange ich zu meinem else-Ergebniss "Keine Zahlen eingegeben". Unten seht ihr meinen verwendeten Programmcode. Ich habe auch schon versucht etwas rum zu spielen bzw. andere Möglichkeiten ausprobiert, die führten aber alle dazu, dass ich entdweder das Programm nicht mal kompilieren konnte oder das Programm dann einen Fehler aufwies.

Würde mich freuen, wenn mir da jemand weiter helfen kann. Vielen Dank schon mal und Grüße,
Dolphin ;-)

Code: Alles auswählen

#include <stdio.h>
#include <ctype.h>

int main( int argc, char * argv[] )
{
	if( argc != 3 )
	{
		printf( "Falsche Anzahl von Argumenten\n" );
		return 0;
	}

	char summand1 = atoi( argv[1] );
	char summand2 = atoi( argv[2] );
	
	if( isdigit( summand1 ) && isdigit( summand2 ) )
	{
		printf( "Ergebnis: %c\n", summand1+summand2 );
	}
		else
		{
			printf( "Keine Zahlen eingegeben\n" );
		}

	return 0;
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: isdigit-Funktion

Beitrag von cloidnerux » Sa Okt 11, 2014 7:35 pm

Hallo zusammen!
Hi und Willkommen im Forum :D
Jetzt wollte ich mit der isdigit-Funktion das so abändern, dass noch überprüft wird, ob auch Zahlen eingegeben wurden. Nur leider gelange ich zu meinem else-Ergebniss "Keine Zahlen eingegeben". Unten seht ihr meinen verwendeten Programmcode. Ich habe auch schon versucht etwas rum zu spielen bzw. andere Möglichkeiten ausprobiert, die führten aber alle dazu, dass ich entdweder das Programm nicht mal kompilieren konnte oder das Programm dann einen Fehler aufwies.
Das Problem liegt hier:

Code: Alles auswählen

  char summand1 = atoi( argv[1] );
   char summand2 = atoi( argv[2] );
   
   if( isdigit( summand1 ) && isdigit( summand2 ) )
Dein Programm soll erst den Text "argv[1]" nehmen, es zu einer Zahl konvertieren und diese dann in den char "summand1" speichern. Gleiches für summand2.
Jetzt willst du prüfen, ob die Konvertierten Zahlen jetzt Zahlen in Textrepräsentation sind(siehe dazu ASCII-Tabelle).
Um das zu verstehen muss man sich zwei dingen Bewusst sein: Dein Computer kennt nur Zahlen, alles sind nur Zahlen. Auch ein Text, ein Bild, ein Video besteht alles nur aus Zahlen. Um jetzt Text zu speichern, hat man sich eine Zuordnung ausgedacht(ASCII-Tabelle) und weißt jetzt einfach einer Zahl einen Buchstaben zu.
IsDigit soll jetzt nicht überprüfen, ob dein char eine Zahl ist, weil der Datentyp Char auch nur eine Zahl ist, sondern ob der Text den dieser char repräsentiert eine Zahl darstellen soll.

Daher müsste es heißen:

Code: Alles auswählen

if(isDigit(argv[1][0]) && isDigit(argv[2][0])   //Sehr unschön hier, nur für Demonstrationszwecke!
{
    summand1 = atoi( argv[1] );
    summand2 = atoi( argv[2] );
    printf( "Ergebnis: %c\n", summand1+summand2 );
}
Ich hoffe ich konnte helfen.

Gruß

cloidnerux
Redundanz macht wiederholen unnötig.
quod erat expectandum

Dolphin
Beiträge: 3
Registriert: Sa Okt 11, 2014 5:36 pm

Re: isdigit-Funktion

Beitrag von Dolphin » Sa Okt 11, 2014 9:12 pm

ja, super, danke, jetzt funktioniert es. :D
ich habe sogar festgestellt, dass ich die Definition meiner Summanden gar nicht in die if-Funktion schreiben, dafür aber den Typ von char in int ändern muss, da mir sonst bei der Ausführung des Programms kein Ergebniss angezeigt wird.

mich würde jetzt allerdings noch interessieren, was bei

Code: Alles auswählen

 if(isDigit(argv[1][0]) && isDigit(argv[2][0]) 
die [0] genau bewirkt (hat das hier auch was mit dem Array zu tun?) und wie man diesen Ausdruck schöner schreiben kann.

Nemo
Beiträge: 37
Registriert: Sa Mär 02, 2013 3:18 pm

Re: isdigit-Funktion

Beitrag von Nemo » So Okt 12, 2014 1:31 pm

Hi Dolphin,

um zu verstehen wofür die [0] benötigt wird, musst du verstehen was wirklich als Parameter übergeben wird:

argv ist ein Array von Char-Zeigern.
argc ist einfach ein Integer, der angibt wie groß der Array ist.

Nehmen wir an du rufst das Programm "adiere" mit den Parametern "4" und "8" auf:
argv[0] entspricht nun dem Char-Array(=String) "adiere"
argv[1] entspricht dem Char-Array "4"
argv[2] entspricht dem Char-Array "8"
Jeder dieser Char-Arrays endet mit einem Null-Byte.

argv[0][0] entspricht einem einzigen Char "a"
argv[1][0] entspricht einem einzigen Char "4"
argv[2][0] entspricht einem einzigen Char "8"

Die Funktion isdigit erwartet einen Char (genau genommen einen Integer, aber die Konvertierung erfolgt automatisch) und keinen Char-Array.

atoi hingegen erwartet einen Char-Array mit Null-Byte am Ende.

Soweit ich das sehe müsste der Aufruf "adiere 4 8a" aufgrund dieses Unterschieds akzeptiert werden, obwohl das natürlich nicht gewollt ist. Versuch doch mal zur Übung, ob du dieses Problem beheben kannst.

Dolphin
Beiträge: 3
Registriert: Sa Okt 11, 2014 5:36 pm

Re: isdigit-Funktion

Beitrag von Dolphin » So Okt 12, 2014 2:56 pm

Hi Nemo,
danke für die Erklärung, damit kann ich jetzt was anfangen. Und mein Programm funktioniert jetzt ja auch. :)

Antworten