NAS

C Ascii to integer und andersherum - getstring()

  • Ersteller Ersteller DefconDev
  • Erstellt am Erstellt am
PHP:
int main()
{
	long int n;
	char string1[100];
	
	for(n=0; ;n=n+1)
	{
	if(n<=6){	
		putstring(" Bitte 1. Zahl eingeben");
		string1[n]=getstring(string1);
		}
		else
		putstring(" Maximale Dezimalstellen erreicht");
		break;
	}
}

Ich hoffe jetzt habe ich es endlich richtig.
 
Ich glaub du hast beim else die Klammern vergessen, sonst springt das Programm immer gleich im ersten Schleifendurchlauf raus.

Aber jetzt passt irgendwie der Titel gar net, weil jetzt hast du deine Zahl im string stehen aber ja noch gar net umgewandelt...
Auch fehlt jetzt ein Testen auf gültige Ziffern sowie das Behandeln einer Zahl kleiner 10000.
 
Ich meinte mit der Zählvariable dass du damit die Anzahl der eingelesenen Zeichen zählst und eben nicht etwa die Größe der Zahl die durch die eingetippten Zeichen beschrieben wird! Dh du musst < 6 checken so dass eben nur 5 Ziffern eingegeben werden können - aber das tust du ja mitlerweile.

Was erhoffst du dir hiervon: string1[n]=getstring(string1); ?
Wir hier im Forum kennen ja getstring nicht, aber ich gehe mal ganz stark davon aus, dass das Unsinn ist.
Was gibst du der Funktion? Den String wo das eingelesen hingeht? Wozu dann noch string1[n] = ...
Außerdem printest du immernoch nur "1." und nie mal "2." und dazu sei direkt gesagt: Bitte lös das nicht mit unterschiedlichen putstrings.. eins für 1. und eins für 2. usw. sonder mach das in der Schleife.
Dh es gibt dann sowas wie putstring(" Bitte %d. Zahl eingeben", n);
 
ich kann jetzt nur das widergeben was in meinen Unterlagen für getstring(A) steht:

Liest solange Zeichen von der Tastatur ein bis die ENTER Taste betätigt wird. Die eingelesenen Zeichen werden im String A gespeichert.

string1[n]=getstring(string1)

ich dachte wenn der User eine eingabe macht wird das im string1 eingespeichert, dieser string wird dann auf string1[n] übergegeben. Soll heißen wenn ich eine eins eingebe, speichert er mir die eins unter dem feldelement n, also am anfang im 0. feldelement des string1.

Kann man das nicht so machen?
Ergänzung ()

Hancock schrieb:
Ich glaub du hast beim else die Klammern vergessen, sonst springt das Programm immer gleich im ersten Schleifendurchlauf raus.
Ja, hatte ich, danke :-)

Hancock schrieb:
Aber jetzt passt irgendwie der Titel gar net, weil jetzt hast du deine Zahl im string stehen aber ja noch gar net umgewandelt...
Auch fehlt jetzt ein Testen auf gültige Ziffern sowie das Behandeln einer Zahl kleiner 10000.

Das umwandeln bin ich gerade dabei, ebenso das prüfen der ziffern.
Ergänzung ()

PapstRatze schrieb:
  • wieso ist das array so groß, wenn man eh nur maximal 5 stellen eingeben kann?
  • "eine for-schleife hat einfach ausgedrückt, ein Zählervariable in deinem Fall n, dann die Bedingung und zuletzt die Erhöhung" Ergo ist die if-Abfrage nicht zeckmäßig.

Habe 100 eingegeben, sicher ist sicher. Ist das schlimm?

Also das mit der for schleife habe ich wie in java behandelt, da gab es keine probleme wenn die bedingung erst in der if abfrage kam. Ist das bei c anders?
Ergänzung ()

PHP:
int main()
{
	long int n;
	char string1[100];
	
	for(n=0; ;n=n+1)
	{
	if(n<=6){	
		putstring(" Bitte 1. Zahl eingeben");
		string1[n]=getstring(string1);
		}
		else
		putstring(" Maximale Dezimalstellen erreicht");
		break;
		}	
	}
	
	long int IntegerWert1;
		

	if(string1[n]>=0x30&&string1[n]<=0x39){
		IntegerWert1=stringtoi(string1[n]);
		}
		else
		{
		putstring(" Fehler,bitte nur Ziffern eingeben");							
		}
	
}
 
Zuletzt bearbeitet von einem Moderator:
1. Frage: Wenn getstring eigentlich eher getchar heißen sollte, dann ja.
2. Frage: Ja, weil du sinnlos Speicher verbrauchst.
3. Frage: Ja es macht semantisch in der Regel das selbe, wenn du aber dein break vergisst, hast du eine Endlosschleife. Das kann dir beim richtigen Verwenden der for-Schlefe nicht passieren.
 
Ich glaube die Interpretation der Funktion ist falsch ;).

Die Funktion nimmt ein Array entgegen und beschreibt dieses, mit den Eingegebenen zahlen. Wenn ich das richtig verstehe, gibt die Funktion gar nichts zurück ?!.

Das heißt du gibst ein Array rein und dieses Array wird dort mit den einzelnen Ziffern beschrieben. D.h. du musst die Funktion nur einmal aufrufen. (Schau doch in die keypad.h (bzw. die keypad.c rein um zu schauen was passiert) damit du weißt ob die Funktion etwas zurückgibt.)
 
Da stimme ich PapstRatze voll zu.. darauf wollte ich hinaus

Ums zu testen könntest du mal den Großteil deines Programms weglassen und nur das hier machen:
Code:
char string1[100];
getstring(string1);
printf("%s\n", string1);
Dann siehst du ja was nach der Funktion getstring in string1 drin ist.
 
Erstmal vielen dank für euren mühen und riesige geduld. Ich werde morgen mal die funktion ganz simpel mal austesten und dann mal schauen was sie genau macht.

Nochmal kurz zur ergänzung.

Die funktion "c=getchar()" habe ich auch in meinem Script. Ist wie folgt definiert:" liest ein einzelnes zeichen von der Tastatur ein und speichert es in der charvariable c"

getstring(A); " Liest solange Zeichen von der Tastatur ein bis die Enter-Taste bestätigt wird. Die eingelesenen Zeichen werden im String A gespeichert.


Das sind die Funktionen die ich aus meinen Lernskripten habe, mit denen ich arbeiten soll.

Ich habe zu anfang selber schon gefrat worin sich die beiden Funktion genau unterscheiden aber die vom Prof. zur verfügung gestellten bsp. benutzen sogar beide funktionen.

PHP:
#ifdef beispiel_2
 
int main() {
        long int zahl1;
        long int zahl2;
        long int ergebnis;
        char string_1[100];
        char string_2[100];
 
 
        putstring("Bitte 1. Zahl eingeben:\n");
        getstring(string_1);
        zahl1=stringtoi(string_1);
 
 
        putstring("Bitte 2. Zahl eingeben:\n");
        getstring(string_1);
        zahl2=stringtoi(string_1);
 
        ergebnis= zahl1 * zahl2;
 
        itostring(ergebnis, string_1);
 
        copystring("Produkt beider Zahlen ist:\n",string_2);
        appendstring(string_1, string_2);
        putstring (string_2);
 
        getchar();
}
#endif // beispiel_2

Also hier tauchen auch beide funktionen auf, nur verstehe ich nicht ganz den zweck von getchar()
 
Zuletzt bearbeitet von einem Moderator:
OK, da wirs jetzt genau wissen können wirs dir erklären...

getstring liest dir eine ganze Zeile der Eingabe ein, du kannst nicht mittendrin aufhören, erst lesen, dann rechnen. Daher sollte der Puffer auch groß genug sein, da sind dann 100 Byte zweckmäßig aber eig. ne Schlamperei, da fehlt ein Parameter für die Funktion, das man nicht über das Ende hinausschreibt...

getchar liest ein einzelnes Zeichen. funktioniert also wie ein Keylogger, Taste wird gedrückt und du kannst direkt darauf reagieren.

Wenn du jetzt eine Zahl einlesen willst und schon beim ersten falschen Zeichen abbrechen willst, dann ists ein Fall für getchar, wenn erst bei Enter die Fehlermeldung kommen soll, nehm getstring.

für getchar() ist dann die Idee fürs Programm
Code:
int zahl=0;
for(int i=0;i<5;++i){
char c=getchar();
if(c>='0'&&c<='9')
zahl*=10+c-'0';
else{
//Fehlerausgabe
break;
}
}
}
Aber jetzt hab ich schon viel zu viel für dich getan...
für getstring wirstes dann auch noch hinbekommen.
 
Hancock

Vielen Dank für die Erklärung, ich tu mich desöfteren schwer einfachste Formulierungen sofort zu verstehen :D

Jetzt verstehe ich aber endlich die Unterschiede zwischen getchar und getstring, das wort keylogger hat bei mir den "aha-Effekt" ausgelöst :-)

Jetzt habe ich nochmal einen neuen start angefangen.

PHP:
#ifdef Mein
   
int main() 
{
        
	long int IntegerWert1;
        
    
	char string1[100] = {'0','0','0','0','0'};
	short int n = 0;

	putstring("Bitte 1. Zahl eingeben:\n");
	getstring(string1);
	n=0;
        while(string1[n] != 0)
                        {
                        n++;
                        };
 
         for(n=0;n<6;n=n+1){
                        if(string1[n]>=0x30 && string1[n]<=0x39){
                        putstring("Zeichen gültig und in Integerumgewandelt");
						IntegerWert1=0x30+string1[n];
			}
			else
			{
                        putstring("Fehler, nur Ziffern:\n");}
			}
}
   
#endif

Ist die Umrechnung von string to integer richtig? Laut meine Unterlagen gab es ein bsp.

if(i>=0&&i<=9)
c1=0x30+i || c1=48+i;

Was ich nicht verstehe ist, warum würde ein IntegerWert1=string1[n]; nicht reichen?


Und beim Rebuild all gabs keine fehlermeldungen.

EDIT: achja ich habe direkt miteiingebaut, das man als erste zahl keine null eingibt.
 
Zuletzt bearbeitet von einem Moderator:
Du setzt jetzt 6 mal hintereinander deinen int auf eine Zahl zwischen 0 und - 9. Wenn zum Beispiel die Zahl 45678956 eingegeben wird erhältst du als "IntegerWert1" -8. (Ps mir fällt jetzt erst auf dass ich noch nie long int gesehen habe ^^, das check ich gleich mal).*

Wie dem auch sei, du willst wahrscheinlich ja am Ende den Wert der gesamten Eingabe haben, also musst du deiner Variable entsprechend immer die nächste Stelle (im 10er System) mitgeben. Eine mathematische Aufgabe, die tatsächlich den späteren Semestern mehr Schwierigkeiten bereitet als einem Zweitklässler ;), aber du wirst es schon schaffen.

*Edit: Okay wie hier beschrieben ist long int also tatsächlich gleichbedeutend mit long ;). Ich würde aber in Hinsicht auf folge Sprachen direkt zu long tendieren ist auch weniger Schreibaufwand :D
 
Zuletzt bearbeitet:
Zeile 15 ist irgendwie komisch...
Solange Zeichen n nicht NULL gehe zum nächsten Zeichen => am Ende hat n die Länge der Eingabe.
Aber: In Zeile 20 setzt du n wieder auf 0

Zeile 21 du hast >= und <= vertauschst, das if ist jetzt grad immer falsch.
Zeile 23 was rechnest du da eigentlich?

Warum IntegerWert1=string1[n] nicht erlabut ist?
Na ja, du verstehst den Unterschied zwischen Symbol und Zahl? Jeder Zahl ist ein Symbol zugeordnet, welches das ist, interessiert C nicht (aber uns, weils wir sonst nicht lesen können), da die Zahlen aber nicht bei 0x0 kommen (sondern 0x30=0 0x31=1 etc) musst du "händisch" die Zahlensymbolen mit ihrer Bedeutung in "Einklang" bringen.
 
Die größer/kleiner als zeichen werden mir noch das genick brechen, oh man^^

ich habe eine Funktion namens
I=stringtoi(A):
Wandelt den String A in einen Integerwert um und speichert diesen in die Integervariable I

Demnach
IntegerWert1=stringtoi(string1[n]), das sollte doch gehen oder?


@Hancock, Zeile 15 hatte ich mir überlegt, wenn das nullte Feldelement von string1 aufgerufen wird und dessen wert = 0 ist, dann erhöhe n nicht. Oder muss ich das Ascii zeichen von angeben '0'?
Ergänzung ()

PapstRatze schrieb:
Du setzt jetzt 6 mal hintereinander deinen int auf eine Zahl zwischen 0 und - 9. Wenn zum Beispiel die Zahl 45678956 eingegeben wird erhältst du als "IntegerWert1" -8.

Das verstehe ich gerade nicht, wo setze ich die zahlen zwishcen 0 bis -9?
 
Nein, das ist bei C der nullterminierte string, ergo sollte eine Zeichenkette mit der Zahl! 0 aufhören, nicht aber mit '0' (was wiederrum 0x30 wäre). (zumindest glaube ich das der Herr Lehrer darauf hinaus will ^^ und würde die Zeichenkettte mit einer '0' aufhören, könnte man nicht zwischen 10 und 1 unterscheiden)

Von dem her ist es schon richtig, aber du zählst hier, wie viele stellen dein string hat und setzt danach den Zähler zurück und sagst meine Zahl hat immer 5 Zeichen basta.;)

IntegerWert1=stringtoi(string1[n]) wenn diese Funktion aus einem array ein int macht, dann geht das (fast) so ja ;). Es sieht aber aus als würde die Funktion ein einzelnes Zeichen nehmen und dann bist du wieder bei meiner Geschichte die ich eben gepostet habe...

#EDIT: @Hades85: Ich glaube du hast es bereits im Code geändert, ich sah da vorher ein - Zeichen, vielleicht hab ich aber auch einfach net richtig hingesehen.
 
Zuletzt bearbeitet:
Also meines wissens wird das so deklariert '\0'.

Ich hatte mir das aber mit null anders gedacht, ich will ja dass der user die erste zahl nicht null eingibt, bzw. die schleife nicht ausgeführt wird.

Also mal grundsätzliches , vielleicht verstehe ich ein array komplett falsch. Ich werde aufgefordert 5 ziffern einzugeben. zb 12345

jetzt wird das zeichen(string) 1 in den string[0] gespeichert, danach wird das zeichen 2 in den string[1] gespiechert, und die 3 in den string[2] usw.

Jetzt soll diese while schleife dafür sorgen dass mein oben beschriebenes bsp. das macht, also alle zeichen in ein string[n] speichern in einer reihenfolge. Aber das wird wohl nur mit getchar gehen oder?
 
Zuletzt bearbeitet von einem Moderator:
'\0' is auch möglich, aber es ist nichts anderes als die Zahl! Null. Und es ist die einzige Zahl, die kein druckbares Zeichen darstellt. Das war mal genau für den Zweck gedacht, dass man eben so das Ende einer Zeichenkette erkennen kann, da 0 ja nie und nimmer ein Druckbares Zeichen ist. (hoffentlich nicht zu abstrakt erklärt ;)).

Wenn du willst, dass man nicht als erstes Zeichen eine '0' eingibt, dann müsstest du die Funktion getString umschreiben.

Deine while-Schleife macht nichts außer n auf die Anzahl der Einträge im Array zu setzten:
Code:
while(string1[n] != 0)
{
     n++;
};

PS: kein ; hinter die Schweifklammern

#EDIT: also wenn du das Programm startest, hast du ein Array mit 100 freien stellen, mal es dir wie ein Parkplatz auf ein Blatt, dann ist es ggf. einfacher zu verstehen. Danach wird die Funktion getString aufgerufen. Da schreibst du jetzt in jede "Parkfläche" ein Zeichen bis irgendwann Enter kommt. Ich gehe davon aus, dass dein Lehrer automatisch dort eine 0 setzt. (Aber Achtung nicht das Zeichen 0 was ja eigentlich 0x30 ist sondern die Zahl!). Jetzt geh dein Programm weiter durch schreibe irgendwo deine Variable n auf und verändere Sie so als würdest du das Programm durchgehen. (Schöner wäre es du lässt das Programm laufen und gehst in einzelschritten durch ;)) ich glaube dann kommst du schon mal ein Stück weiter ;)
 
Zuletzt bearbeitet:
Erstmal danke. Ich glaube es liegt an meinem verständnis für ein array. ich interpretiere das glaube ich falsch.

Also sagen wir mal der User macht eine eingabe von 5134.

diese wird dann im string1 gespeichert. Meine while schleife zählt nun die integerwerte durch, das sind bei 5134 sind das vier integerwerte oder ein integerwert? Also ist das array dann string[1] mit dem wert 5134 oder ist der string[4]={5,1,3,4}?
 
Zurück
Oben