C: Programm gestartet. Aber beendet sofort!

FBIagent

Erfahrenes Mitglied
Ich hab ein kleines Problem mit einem kleinen Programm das lediglich eine Funktion
aufruft um einen String einzugeben.

Aber ich starte es und es beendet sofort wieder:
Code:
#include <stdio.h>
#include <conio.h>

char *input_str()
{

    int pos, integ;
    char str[256], key;
    char *return_str;
    key=0;
    pos=0;

    do
    {

        key=getch();
        
        if(key>64 || key==<92)
        {
            str[pos]=key;
            printf("%c",str[pos]);
            pos++;
        }//Großbuchstaben
        
        if(key>64+32 || key==<92+32)
        {
            str[pos]=key;
            printf("%c",str[pos]);
            pos++;
        }//Kleinbuchstaben
        
        if(key>47 || key<59)
        {
            str[pos]=key;
            printf("%c",str[pos]);
            pos++;
            key=0;
        }//Zahlen
        
        if(key==33 || key==34 || key==44 || key==45 || key==46 || key==58 || key==61 || key==63)
        {
            str[pos]=key;
            printf("%c",str[pos]);
            pos++;
            key=0;
        }//Satzzeichen
        
        if(key==13)
        {
            break;
        }//Eingbentaste Abfrage
        
	}while(key!=13);
	
    return_str = malloc(pos+1);
	return_str[pos] = '\0';
	for(integ=0;integ=pos-1;integ++){
        return_str[integ] = str[integ];
    }
    
	return return_str;
}//Einen String eingeben. Wenn mehr als 256 Zeichen eingegeben werden, wird der Rest abgeschnitten

int main()
{
	char *my_input;
    
    my_input = input_str();
	printf("%s",my_input);
	
	return 0;
}//Main

THX
MFG FBIagent
 
Hi.

Kompiliert das Programm denn überhaupt? Was ist denn das: "==<" für ein Operator? Da meintest du doch sicherlich ein Kleiner-oder-Gleich "<=", oder?

Dann sind ein paar von deinen Tests falsch. Wenn du prüfen willst ob ein Wert zwischen 2 anderen Werten liegt mußt du das logische UND verwenden, nicht das ODER:
Code:
if(key > 64 && key <= 92)
Also wenn der eingegebene "key" größer als 64 und kleiner oder gleich 92 ist, dann handelt es sich um einen Großbuchstaben.

Es gibt übrigens auch Funktionen deklariert im Header ctype.h die diese Tests durchführen: islower, isupper, isdigit, ispunct prüfen ob es sich bei einem Zeichen um Kleinbuchstaben, Großbuchstaben, Ziffern oder Satzzeichen handelt. isalnum prüft ob es sich um ein alphanumerisches Zeichen handelt. :google:

Du solltest vor dem return in main auch noch ein getch() Aufruf machen, damit du die Ausgabe des Programmes sehen kannst (sonst ist es tatsächlich gleich wieder weg).
 
Das mit dem key==<92 war nur nen Tipfehler da sollte eigentlich stehen key<93.
Okay das mit dem && hab ich mal geändert daran sollte es aber nicht liegen das das Prog beendet
nach dem starten. Hab auch nen getch(); vor dem return 0; im main eingefügt aber hilft nix.

Ach cool jetzt ist der Compiler abgeschmiert hab neu gestartet und ich kann eingeben :)

Aber jetzt noch ein Problem: es wir nicht auf ENTER reagiert die do while schleife
läuft weiter. Wieso?

Ich will das entlich mal fertig bekommen hab mich mit dem String zurückgeben schon
lange genug rumgeschlagen.

Außerdem will ich langsam mal mit C++ anfangen. Das ist das letzte was ich in C mache!

Code:
#include <stdio.h>
#include <conio.h>

char *input_str()
{

    int pos, integ;
    char str[256], key;
    char *return_str;
    key=0;
    pos=0;

    do
    {

        key=getch();
        
        if(key>64 && key<93)
        {
            str[pos]=key;
            printf("%c",str[pos]);
            pos++;
            key=0;
        }//Großbuchstaben
        
        if(key>64+32 && key<93+32)
        {
            str[pos]=key;
            printf("%c",str[pos]);
            pos++;
            key=0;
        }//Kleinbuchstaben
        
        if(key>47 && key<59)
        {
            str[pos]=key;
            printf("%c",str[pos]);
            pos++;
            key=0;
        }//Zahlen
        
        if(key==33 && key==34 && key==44 && key==45 && key==46 && key==58 && key==61 && key==63)
        {
            str[pos]=key;
            printf("%c",str[pos]);
            pos++;
            key=0;
        }//Satzzeichen
        
        if(key==13)
        {
            break;
        }//Eingbentaste Abfrage
        
	}while(key!=13);
	
    return_str = malloc(pos+1);
	return_str[pos] = '\0';
	for(integ=0;integ=pos-1;integ++){
        return_str[integ] = str[integ];
    }
    
	return return_str;
}//Einen String eingeben. Wenn mehr als 256 Zeichen eingegeben werden, wird der Rest abgeschnitten

int main()
{
	char *my_input;
    
    my_input = input_str();
	printf("\n%s",my_input);
	getch();
	
	return 0;
}//Main
EDIT: Hab mal grad geguckt aufd ENTER wir doch reagiert aber man kann nichts mehr
---------machen nachdem man ENTER gedrückt hat
 
Zuletzt bearbeitet:
FBIagent hat gesagt.:
Das mit dem key==<92 war nur nen Tipfehler da sollte eigentlich stehen key<93.
Okay das mit dem && hab ich mal geändert daran sollte es aber nicht liegen
Hihi. Aber zuviel. Du solltest doch nur die Stellen ändern wo es darum geht zu prüfen ob key zwischen 2 Werten liegt.

Du hast es auch geändert an einer Stelle wo es darum geht zu prüfen ob key gleich einer von mehreren Werten ist. Da war das log. ODER schon richtig.
Code:
if (key == 33 || key == 34 || key == 44 /* ... */
Deine if-Bedingung macht ja keinen Sinn denn key kann ja nicht gleichzeitig 33, 34, 44, 45 usw. sein. :-)

FBIagent hat gesagt.:
EDIT: Hab mal grad geguckt aufd ENTER wir doch reagiert aber man kann nichts mehr machen nachdem man ENTER gedrückt hat
:confused: Das ist ja auch der Sinn der Sache oder? Ich meine die Schleife läuft doch nur solange bis Enter gedrückt wird. Dann sollte der bisherige Text ausgegeben werden und das Programm stoppen bis wieder eine Taste gedrückt wird. Dann ist das Programm zuende.

Übrigens hast du vergessen den mit malloc angelegten Speicher wieder freizugeben.
Code:
free (my_input);
return 0;

Sonst kann ich weiter nichts entdecken - und leider kann ich es nicht ausprobieren.
 
Ach, jetzt ist mir doch noch was aufgefallen:
FBIagent hat gesagt.:
Code:
for(integ=0;integ=pos-1;integ++){
  return_str[integ] = str[integ];
}
Du hast dort in der Schleifenbedingung eine Zuweisung hineingeschrieben! Der Wert dieser Zuweisung ist immer (pos-1) und sollte pos ungleich 1 sein, dann hast du eine schöne Endlosschleife. (jetzt versteh ich erst was du meinst mit "man kann nichts mehr machen").

Code:
for (integ = 0; integ < pos; ++integ)
   return_str[integ] = str[integ];

(nebenbei hättest du hier auch die Standard Funktion strcpy nehmen können statt selber eine Schleife zusammenzuschustern ;))
 
UPS, das bei den Satzzeichen hab ich dann mal vertan. Ich merk schon hab längere Zeit nichts
gemacht gehabt.

Das ist ja auch der Sinn der Sache oder? Ich meine die Schleife läuft doch nur solange bis Enter gedrückt wird. Dann sollte der bisherige Text ausgegeben werden und das Programm stoppen bis wieder eine Taste gedrückt wird. Dann ist das Programm zuende.

Das Programm beendet garnicht egal was ich nach dem druck auf ENTER drücke.
Das print(); wird noch nicht einmal erreicht!

Code:
free(my_input);

Ich mache ja nicht my_input = malloc(pos+1); sondern return_str = malloc(pos+1);
also muss ich sozusagen noch am ende der Funktion free(return_str); eingeben, aber
daführ bräuchte ich wieder einen extra char* damit ich return_str in diesen geben kann,
dann free(return_str); und dann return extra char*; oder wie sehe ich das?
Oder kann ich das free(return_str); auch noch nach dem return return_str; machen?

P.S: Ich versuche sachen immer ohne irgendwelche vereinfachten Funktionen zu
-------schreiben. Erhöht auf jeden fall das verständniss. Am besten schreib ich mir
-------noch nen Ersatz für malloc();... ach quatsch :D Ich hatte es erst so versucht wie es
-------jetzt ist aber das hatte nicht geklappt. Dann auch mal strcpy(); genommen und
-------wieder nichts. Dann wieder zu meiner lösung gekommen.
 
Zuletzt bearbeitet:
FBIagent hat gesagt.:
Das Programm beendet garnicht egal was ich nach dem druck auf ENTER drücke.
Das liegt an der Endlosschleife die du programmiert hast. Siehe meinen vorigen Beitrag.

FBIagen hat gesagt.:
Ich mache ja nicht my_input = malloc(pos+1); sondern return_str = malloc(pos+1);
Genau, du allozierst Speicher, weist diesen Speicher an return_str zu. Dann gibst du return_str als Ergebnis der Funktion zurück. Der Programmteil der die Funktion input_str aufgerufen hat ist damit verantwortlich für die Freigabe des Speichers. D.h. du mußt den Speicher in der Funktion main freigeben sobald du ihn nicht mehr brauchst.

FBIagent hat gesagt.:
also muss ich sozusagen noch am ende der Funktion free(return_str); eingeben
Nein, das geht ja nicht. Du brauchst den Speicher ja noch für den Rückgabewert.
 
Zurück