brauche hilfe bei C

Freie Themenwahl.

Moderator: Moderator

brauche hilfe bei C

Beitragvon michael » 09.11.2008, 19:26

Hier ist mein Quellcode, ich bekomm das mit dem "if" vergleich nicht hin,
hat irgendwas mit variablentyp stezen zu tun soviel hab ich schon raus,
bitte um Hilfe

#include <stdio.h>
#include <string.h>
#define MAX 40

int main (void)
{

char eingegebenes [MAX+1];
printf ("################################\n");
printf ("# #\n");
printf ("# C #\n");
printf ("# #\n");
printf ("# Michael #\n");
printf ("# #\n");
printf ("################################\n");
printf ("\n\nBitte etwas eingeben\n");
gets (&eingegebenes);

if (eingegebenes == "hallo")
{
printf ("unmöglich\n");
}
else
{
printf ("tachchen psycho\n");
}

return 0;
}
--------
mfg
Michael

Bild
Benutzeravatar
michael
 
Beiträge: 12
Registriert: 28.04.2008, 15:57

Beitragvon Zappo » 09.11.2008, 19:40

Da strings in C eigentlich arrays von chars sind, kann man nicht einfach string1 == string2 machen, sondern muss eine entsprechende Funktion verwenden (strcmp um genau zu sein). Außerdem sollte man gets auch nicht verwenden (und wenn man es schon tut, dann richtig), sondern fgets(wohin_speichern, wieviele_zeichen, stdin).
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
#define MAX 40

int main (void) {

  char eingegebenes[MAX+1];
 
  printf ("################################\n");
  printf ("#                             #\n");
  printf ("# C                           #\n");
  printf ("#                             #\n");
  printf ("# Michael                     #\n");
  printf ("#                             #\n");
  printf ("################################\n");
 
  printf ("\n\nBitte etwas eingeben\n");
  fgets(eingegebenes, MAX+1, stdin);

  if (strcmp(eingegebenes, "hallo"))
   printf ("unmöglich\n");
  else
   printf ("tachchen psycho\n");

  return 0;
}
[img]http://www.boincstats.com/signature/user_6724.gif[/img]
Benutzeravatar
Zappo
 
Beiträge: 65
Registriert: 26.03.2008, 19:48
Lizenz: CC
Distribution: ArchLinux
Kernelversion: neueste

Beitragvon michael » 09.11.2008, 19:56

[quote=Zappo,index.php?page=Thread&postID=31983#post31983]Da strings in C eigentlich arrays von chars sind, kann man nicht einfach string1 == string2 machen, sondern muss eine entsprechende Funktion verwenden (strcmp um genau zu sein). Außerdem sollte man gets auch nicht verwenden (und wenn man es schon tut, dann richtig), sondern fgets(wohin_speichern, wieviele_zeichen, stdin).
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
#define MAX 40

int main (void) {

  char eingegebenes[MAX+1];
 
  printf ("################################\n");
  printf ("#                             #\n");
  printf ("# C                           #\n");
  printf ("#                             #\n");
  printf ("# Michael                     #\n");
  printf ("#                             #\n");
  printf ("################################\n");
 
  printf ("\n\nBitte etwas eingeben\n");
  fgets(eingegebenes, MAX+1, stdin);

  if (strcmp(eingegebenes, "hallo"))
   printf ("unmöglich\n");
  else
   printf ("tachchen psycho\n");

  return 0;
}




Danke, Danke, Danke, Danke, Danke
funktioniert, hab den ganzen letzten abend danach gesucht, und nichts gefunden.
Nochmal Danke! :)
[/quote]
--------
mfg
Michael

Bild
Benutzeravatar
michael
 
Beiträge: 12
Registriert: 28.04.2008, 15:57

Beitragvon michael » 09.11.2008, 20:05

[quote=michael,index.php?page=Thread&postID=31985#post31985]
[quote=Zappo,index.php?page=Thread&postID=31983#post31983]Da strings in C eigentlich arrays von chars sind, kann man nicht einfach string1 == string2 machen, sondern muss eine entsprechende Funktion verwenden (strcmp um genau zu sein). Außerdem sollte man gets auch nicht verwenden (und wenn man es schon tut, dann richtig), sondern fgets(wohin_speichern, wieviele_zeichen, stdin).
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
#define MAX 40

int main (void) {

  char eingegebenes[MAX+1];
 
  printf ("################################\n");
  printf ("#                             #\n");
  printf ("# C                           #\n");
  printf ("#                             #\n");
  printf ("# Michael                     #\n");
  printf ("#                             #\n");
  printf ("################################\n");
 
  printf ("\n\nBitte etwas eingeben\n");
  fgets(eingegebenes, MAX+1, stdin);

  if (strcmp(eingegebenes, "hallo"))
   printf ("unmöglich\n");
  else
   printf ("tachchen psycho\n");

  return 0;
}




Danke, Danke, Danke, Danke, Danke
funktioniert, hab den ganzen letzten abend danach gesucht, und nichts gefunden.
Nochmal Danke! :)
[/quote][/quote]Ooops, zu foreilig
jetzt funktioniert das zweite nicht,
also das nach dem "else"

also noch offen, wie funktionierts?
--------
mfg
Michael

Bild
Benutzeravatar
michael
 
Beiträge: 12
Registriert: 28.04.2008, 15:57

Beitragvon ChemicalBrother » 09.11.2008, 22:04

@michael: Nutze doch bitte die code-Tags und zitiere nicht komplette Beiträge, wenn es nicht wirklich nötig ist, sonst wird das hier schnell unübersichtlich.
Benutzeravatar
ChemicalBrother
 
Beiträge: 5332
Registriert: 21.08.2006, 21:17
Wohnort: Langen
Lizenz: CC
Distribution: Arch Linux
Kernelversion: 6.0

Beitragvon fiesling » 09.11.2008, 22:09

C ist nicht mein Gebiet aber wie rufst du denn "main (void)" auf muss da net irgendwo die subroutine aufgerufen werden???
i686 Intel(R) Core(TM)2 Duo CPU T5450 @ 1.66GHz GenuineIntel GNU/Linux; WINE- 1.1.33; OpenGL version string: 3.0.0 NVIDIA 190.42;
fiesling
 
Beiträge: 127
Registriert: 28.01.2008, 21:53
Wohnort: Gütersloh

Beitragvon Zappo » 09.11.2008, 22:43

@fiesling: main ist die Einstiegsroutine von jedem C-Programm. Die wird automatisch aufgerufen. Daher ist das schon korrekt so.

@michael: Nur ein kleiner Fehler (der dir hätte auch auffallen können). strcmp liefert bei Gleichheit der beiden Strings 0 zurück, was natürlich in diesem Fall als False ausgewertet wird. Entweder vertauschst du den if- und else-block oder du machst etwas in der Art
Code: Alles auswählen
if (strcmp(eingegebenes, "hallo\n") == 0) {
  printf("foo\n");
} else {
  printf("bar\n");
}

Man beachte, dass ich beim Vergleich "hallo\n" (also mit dem linebreak) schreibe, da fgets diesen beim Lesen von stdin nicht entfernt (im Gegensatz zum Fall, wenn es aus einer Datei liest).
[img]http://www.boincstats.com/signature/user_6724.gif[/img]
Benutzeravatar
Zappo
 
Beiträge: 65
Registriert: 26.03.2008, 19:48
Lizenz: CC
Distribution: ArchLinux
Kernelversion: neueste

Beitragvon michael » 10.11.2008, 19:47

[quote=Zappo,index.php?page=Thread&postID=31989#post31989]@fiesling: main ist die Einstiegsroutine von jedem C-Programm. Die wird automatisch aufgerufen. Daher ist das schon korrekt so.

@michael: Nur ein kleiner Fehler (der dir hätte auch auffallen können). strcmp liefert bei Gleichheit der beiden Strings 0 zurück, was natürlich in diesem Fall als False ausgewertet wird. Entweder vertauschst du den if- und else-block oder du machst etwas in der Art
Code: Alles auswählen
if (strcmp(eingegebenes, "hallo\n") == 0) {
  printf("foo\n");
} else {
  printf("bar\n");
}

Man beachte, dass ich beim Vergleich "hallo\n" (also mit dem linebreak) schreibe, da fgets diesen beim Lesen von stdin nicht entfernt (im Gegensatz zum Fall, wenn es aus einer Datei liest).[/quote]Ah ok jetzt läufts,
danke!
bin erst einsteiger daher fällt mir sowas eher nicht auf XD
trotzdem Danke!!!
--------
mfg
Michael

Bild
Benutzeravatar
michael
 
Beiträge: 12
Registriert: 28.04.2008, 15:57

Beitragvon leszek » 11.11.2008, 13:19

Ich würde die Eingabe mit scanf machen. Das geht dann auch viel einfacher :P
Beispiel:
Code: Alles auswählen

scanf ("Eingabe %s", &eingabe)   

Zur Erklärung %s steht für String und &eingabe für die eingabevariable.(In Wirklichkeit ein Zeiger )
Benutzeravatar
leszek
 
Beiträge: 191
Registriert: 30.08.2007, 19:53

Beitragvon Zappo » 11.11.2008, 16:09

scanf ist eine schlechte Wahl, weil dabei nicht überprüft wird, ob die Eingabe auch in den string eingabe passt. Außerdem ist das Beispiel auch falsch, da bei der Eingabe von strings nicht die Adresse das Ziel ist (da strings schon pointer sind). Das macht man z.B. bei der Eingabe von irgendwelchen Zahlenwerten.
[img]http://www.boincstats.com/signature/user_6724.gif[/img]
Benutzeravatar
Zappo
 
Beiträge: 65
Registriert: 26.03.2008, 19:48
Lizenz: CC
Distribution: ArchLinux
Kernelversion: neueste


Zurück zu Alles was euch den Tag über bewegt...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste