Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Problem mit scanf() - wird einfach übergangen

  1. #1
    Registrierter Benutzer
    Registriert seit
    16.08.2002
    Beiträge
    23

    Problem mit scanf() - wird einfach übergangen

    Ich hab hier ein kleinen "Drecksproggi" geschrieben, dass vom Prinzip her läuft. Es wird aber eine scanf() Funktion einfach übergangen.
    Code:
    #include <stdio.h>
    #include <string.h>
    /*
    #include "stringFunctions.c"
    #include "stringFunctions.h"
    */
    
    void outString(char string[],int stringLength)
    {
    	int i;
    	for (i = 0; i < stringLength; i++)
    	{
    		printf("%c",string[i]);
    	}
    }
    
    int getString(char string[])
    {
    	int stringLength;
    	scanf("%s",&string[0]);
    	stringLength = strlen(string);
    	return stringLength;
    }
    
    int equal(char string1[], int stringLength1, char string2[], int stringLength2)
    {
    	int i;
    	if (stringLength1 != stringLength2)
    	{
    		return 0;
    	}
    	else
    	{
    		for (i = 0; i < stringLength1; i++)
    		{
    			if (string1[i] != string2[i])
    			{	return 0; }
    		}
    	}
    	return 1;
    }
    
    int searchChar(char string[], int stringLength, char search)
    {
    	int i;
    	int searchresult = 0;
    	for (i=0; i < stringLength; i++)
    	{
    		if (string[i] == search)
    		{	searchresult++; }
    	}
    	return searchresult;
    }
    
    int main()
    {
    	char name1[15];
    	char name2[15];
    	int stringLength1 = 0;
    	int stringLength2 = 0;
    	int gleichheit = 0;
    	char buchstabe;
    	int ergebnis1 = 0;
    	int ergebnis2 = 0;
    	printf("Bitte geben Sie den ersten Namen ein: ");
    	stringLength1 = getString(name1);
    	printf("Bitte geben Sie den zweiten Namen ein: ");
    	stringLength2 = getString(name2);
    	printf("Das erste Wort war: ");
    	outString(name1,stringLength1);
    	printf("\nEs hat %i Buchstaben.",stringLength1);
    	printf("\nDas zweie Wort war: ");
    	outString(name2,stringLength2);
    	printf("\nEs hat %i Buchstaben.",stringLength2);
    	printf("\nTeste auf Gleichheit...\n");
    	gleichheit = equal(name1,stringLength1,name2,stringLength2);
    	if (gleichheit == 0)
    	{
    		printf("\nDie beiden Namen sind nicht gleich!");
    	}
    	else
    	{
    		printf("\nDie beiden Namen sind gleich!");
    	}
    	printf("\nNach welchem Buchstaben soll gesucht werden? ");
    	scanf("%c",&buchstabe);   /* Dieses scanf() wird übergangen :( */
    	ergebnis1 = searchChar(name1,stringLength1,buchstabe);
    	ergebnis2 = searchChar(name2,stringLength2,buchstabe);
    	printf("\nDer erste Name enthält den gesuchten Buchstaben %i mal",ergebnis1);
    	printf("\nDer zweite Name enthält den gesuchten Buchstaben %i mal\n",ergebnis2);
    	return 0;
    }
    Ich hab's auch schonmal mit fflush(stdin) und (stdout) probiert, aber es kommt immer noch das selbe. Findet vieleicht jemand eine Programmierfehler, oder weiß jemand Rat, was ich tun kann, um das zu unterbinden?

  2. #2
    Registrierter Benutzer
    Registriert seit
    16.09.2002
    Beiträge
    73
    probier mal ne neue getstring-funktion:

    int getString(char* str, int maxlength)
    {
    fgets(str, maxlength, stdin);
    return strlen(str);
    }

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.08.2002
    Beiträge
    23
    @brotzi
    Ich weiß nicht, was das bringen soll. Die scanf Funktion in der getString Funktion funktioniert ja. Aber weiter unten in der main Funktionen wird das scanf übergangen.
    Code:
    dennis@xerxes dennis $ ./a.out
    Bitte geben Sie den ersten Namen ein: hallo
    Bitte geben Sie den zweiten Namen ein: dummsau
    Das erste Wort war: hallo
    Es hat 5 Buchstaben.
    Das zweie Wort war: dummsau
    Es hat 7 Buchstaben.
    Teste auf Gleichheit...
    
    Die beiden Namen sind nicht gleich!
    Nach welchem Buchstaben soll gesucht werden?
    Der erste Name enthält den gesuchten Buchstaben 0 mal
    Der zweite Name enthält den gesuchten Buchstaben 0 mal
    dennis@xerxes dennis $
    An der Stelle, wo der zu suchende Buchstabe abgefragt werdem soll, geht er einfach vor bei und wartet nicht auf einen Eingabe.

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Welchen Wert hat buchstabe nach dem scanf?

    Vielleicht ist das noch das newline aus der vorigen Eingabe.

    Du könntest dir Code sparen, wenn du statt deinen eigenen die Funktionen aus string.h bzw. stdio.h benutzt.

    printf("%s", string) statt outString
    bzw.
    strcmp statt equal, bzw strcmp in equal.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    16.09.2002
    Beiträge
    73
    ok, ich hatte den kommentar an dem scanf übersehen.

    ersetze dein scanf doch mal wie folgt:

    int buchstabe;
    buchstabe = getchar();

    im übrigen solltest du trotzdem mal drüber nachdenken ob deine getString-routine gut ist. Wenn jemand zuviel text eingibt hast du mal schnell einen buffer-overflow.

  6. #6
    Registrierter Benutzer
    Registriert seit
    16.08.2002
    Beiträge
    23
    Sicherlich könnte ich die string Funktionen aus der string.h benutzen, was ich aber leider nicht darf. Ich soll eigene Funktionen basteln.... (Ist halt für die FH)
    Eine Abfrage in der getString() wird später eingebaut, um einen BufferOverflow zu verhindern. Das ganze Proggi ist ja noch im Rohbau.
    Durch ein "printf("%c",buchstabe); nach dem scanf hab ich herrausgefunden, das sich eine Leerzeile in der Variable befinden. Aber wo kommt das her?
    Die Funktion getchar() führt zum selben Ergebnis ...aber dennoch, guter Tipp

  7. #7
    Registrierter Benutzer
    Registriert seit
    16.09.2002
    Beiträge
    73
    na dann versuch doch mal folgendes:

    char buffer[10];
    scanf("%s",buffer);
    buchstabe = buffer[0];

  8. #8
    Registrierter Benutzer
    Registriert seit
    16.08.2002
    Beiträge
    23
    so funzt das Proggi,..aber so ist das doch recht "getrickst". Ich denke, das ist so nicht der Sinn der Sache. Kann man da nicht was anderes noch machen?

  9. #9
    Registrierter Benutzer
    Registriert seit
    16.09.2002
    Beiträge
    73
    prima,
    ich schätze wie schon vorher erwähnt wird wohl noch ein newline im puffer sein und das wird von scanf vorher nicht rausgeholt. Wenn du also bei den basics bleiben willst kannst du ja 2 funktionen machen: getString und getChar. Beide lesen mit getchar() solange bis ein newline ("\n") auftritt. Dieses wird dann durch NULL ersetzt um das ende des String zu kennzeichnen. Damit hast du erstens die Möglichkeit später eine Längenprüfung einzufügen und zweitens holst du mit sicherheit das newline aus dem puffer.
    Die zweite Möglichkeit für dein getChar wäre mit getchar() solange zu lesen, bis ein Zeichen >' '(in ASCII sind alle Buchstaben,Zahlen und sonstiges größer als das Leerzeichen(32), Newline ist 10 oder 13 glaub ich) auftritt.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •