WinFuture-Forum.de: Ein Lesen Des Namens über Gets() - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Ein Lesen Des Namens über Gets() hilfe


#1 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

  geschrieben 05. März 2008 - 14:05

Also ich will eine Funktion schreiben die Werte einliest und dann diese zurückgibt. Zum Einlesen des Namens wollte ich gets() benutzten.
Komme aber nicht weiter weil ich keine Literatur finde?

Dieser Beitrag wurde von centro bearbeitet: 05. März 2008 - 14:06

0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.701
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 05. März 2008 - 14:15

Hier http://www.cplusplus...stdio/gets.html
0

#3 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

geschrieben 05. März 2008 - 14:58

Thank you for your help
0

#4 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

geschrieben 05. März 2008 - 15:13

ok was mache ich aber wenn ich zwei Namen einlesen will :

char string [256];

printf ("Insert your full address: ");
gets (string);
printf ("Your address is: %s\n",string);

char string [256];
printf ("Insert your full address: ");
gets (string );
printf ("Your address is: %s\n",string);
return 0;
Das hier klappt ja nicht

Dieser Beitrag wurde von centro bearbeitet: 05. März 2008 - 15:13

0

#5 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 386
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 05. März 2008 - 18:25

Okay, hier erstmal etwas Deutschsprachiges zum Thema gets() (brauchst Du deutschsprachige Anleitungen oder ist Englisch auch in Ordnung?). Bitte beachte, dass statt gets() besser fgets() benutzt werden sollte. Warum das so ist, steht in dem verlinkten Buch.

Zu Deinem konkreten Problem:

Es klappt deswegen nicht, weil Du ja schon ein char-Array namens "string" hast, also kannst Du kein zweites mit demselben Namen anlegen (woher sollte der Compiler sonst wissen, auf welches Du Dich beziehst, wenn Du "string" schreibst?). Entweder Du legst ein neues char-Array mit neuem Namen an (das natürlich auch wieder Speicherplatz belegt), oder Du benutzt das bereits vorhandene char-Array "string" nochmals, wenn Du den alten Inhalt nicht mehr brauchst.
Da Du im Prinzip ja beide Male dasselbe machst, habe ich hier eine for-Schleife benutzt, die an Dein ursprüngliches Beispiel angelehnt ist (zwei Durchgänge). Das char-Array "string" wird jedes Mal wieder mit neuem Inhalt belegt. Außerdem habe ich fgets() benutzt - man sollte sich gar nicht zu sehr an gets() gewöhnen. Probier ruhig mal aus, was passiert, wenn man mehr als 255 Zeichen eintippt.


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

int main(void)
{
	int i;
	char string[MAX];

	for(i=0; i<2; i++)
	{
		printf ("Insert your full address: ");
		fgets (string, MAX, stdin);
		printf ("Your address is: %s\n",string);
	}
	return 0;
}



Grüße
Def
Eingefügtes Bild
0

#6 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

  geschrieben 05. März 2008 - 19:44

Cool danke English geht auch erhöht das lateral denken .Weil wenn ich mir manchmal anschaue wie meine Rechtschreibung ist oder Satzstellung bekomme ich richtig Angst .Somit kann es ja nicht schaden .Bin aber auch für jede deutschsprachige Seite dankbar .

Dieser Beitrag wurde von centro bearbeitet: 05. März 2008 - 21:12

0

#7 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

  geschrieben 05. März 2008 - 21:20

So geht es .Ich habe gedacht das der Ausdruck string eine Konstante ist die man nicht Substituieren darf echt dumm von mir, ist ja im Grunde so wie bei jedem anderen array.
Danke,ich hoffe es ist in Ordnung das ich immer mein Programm mit einbringe.


int main(){

char string [256];

printf ("Insert your full address: ");
gets (string);
printf ("Your address is: %s\n",string);

char Tom [256];
printf ("Insert your full address: ");
gets (Tom );
printf ("Your address is: %s\n",Tom);
return 0;
}

Dieser Beitrag wurde von centro bearbeitet: 05. März 2008 - 21:24

0

#8 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 386
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 05. März 2008 - 21:38

Ja, das sieht so weit okay aus (will sagen, ich hab Deinen Code nicht kompiliert und getestet, sondern nur in Augenschein genommen). Wie gesagt, gets() mag für Beispielprogramme ausreichend sein, sollte aber in Produktionscode (das heißt: in "richtigen" Programmen, die man weitergeben will) durch fgets() ersetzt werden, denn sonst ist das Programm anfällig für buffer overflows, d.h. es enthält eine potenzielle Sicherheitslücke.
Ich glaube, Dein Missverständnis bezüglich der Frage, ob char-Arrays konstant sind oder nicht, kam daher, dass bei folgender Definition:

char string[10];

"string" zwar durchaus ein konstanter (unveränderlicher) Zeiger (Pointer) auf ein char-Array ist, das char-Array selbst hingegen jedoch nicht konstant, sondern variabel (verändernbar) ist.

Viele Grüße
Def
Eingefügtes Bild
0

#9 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

geschrieben 05. März 2008 - 22:21

Ja da hast Du recht !
string ist nur der Name der variabel und somit veränderbar.Ich habe ja #include <string.h> deswegen
habe ich gedacht das es nicht veränderbar ist .Danke aber moch einmal. fgets() ok werde ich so machen.
0

#10 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 386
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 06. März 2008 - 16:22

Ein paar Hintergründe, falls es Dich interessiert:

Ich hatte ja bereits gesagt, dass bei der Definition

char string[10];

"string" ein konstanter Zeiger ist, und der Compiler deswegen eine Zuweisung wie

string = "Hallo";

ablehnen muss. Aber selbst wenn "string" nicht konstant wäre, könnte der Compiler nichts damit anfangen, denn ein char-Array ist natürlich etwas anderes als ein Pointer auf ein char-Array. Der Compiler müsste also eine Typumwandlung durchführen, die hier aber keinen Sinn ergibt.
Man müsste die Werte also einzeln zuweisen:

string[0] = 'H';
string[1] = 'a';
string[2] = 'l';
/* usw. */

Dass das umständlich ist bzw. der menschlichen Intuition widerspricht (denn einem Menschen ist natürlich sonnenklar, was die Anweisung string = "Hallo"; bezwecken soll), war wohl auch den Machern der Sprache C klar, weswegen sie die Stringbibliothek für C ersonnen haben, symbolisiert durch den Header <string.h>. Damit bekommt der Programmierer zumindest die Illusion, dass es so etwas Ähnliches wie Strings in C gäbe. Obwohl <string.h> zur Standardbibliothek gehört, sind Stringoperationen eben nicht Bestandteil der eigentlichen Sprache C. Deutlich zu sehen am Unterschied zwischen der intuitiven, aber falschen Syntax

string = "Hallo";

und der richtigen, aber gewöhnungsbedürftigen und umständlichen Syntax:

#include <string.h>
/* ... */
strcpy(string, "Hallo");

Mal ganz angesehen davon, dass bei der Initialisierung folgende Syntax möglich ist:

char string[] = "Hallo";

was die ganze Sache vollends absurd und überflüssig erscheinen lässt.
Bei C++ gibt es in der Standardbibliothek eine mächtige Klasse, die Strings zur Verfügung stellt. Außerdem bietet C++ noch die Möglichkeit, Operatoren zu überladen (operator overloading), also Operatoren für neue Klassen mit einer neuen Bedeutung zu versehen. Die Macher der erwähnten Stringklasse haben also den Operator für Zuweisung (das einfache Gleichheitszeichen) auch für ihre Stringklasse überladen, so dass dann auch Sachen wie mystring = "whatever" möglich sind. Dadurch werden neue Datentypen, die nur in Bibliotheken existieren, also viel besser in die Sprache integriert, als es in C je möglich wäre. Natürlich öffnen diese neuen Möglichkeiten auch Tür und Tor für irgendwelchen Unsinn, der in C++ noch viel grausamer als in C sein kann. (Was würde beispielsweise beim Vergleich if(student1 < student2) verglichen werden? Körpergröße? ID? ...) Es kommt also immer auf das Geschick des Programmierers an, die Möglichkeiten sinnvoll zu nutzen und nur Operatoren umzudefinieren, die im Hinblick auf die neue Klasse intuitiv einleuchtend sind.
Und dann gibt es noch Programmiersprachen, die Strings für so wichtig halten, dass sie sie gleich fest in die Sprache einbauen, was auch Vorteile haben kann. Sieh Dir z.B. mal die Programmiersprache D an.

Viele Grüße
Def

Dieser Beitrag wurde von def bearbeitet: 06. März 2008 - 17:36

Eingefügtes Bild
0

#11 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

geschrieben 08. März 2008 - 12:43

Danke werde ich machen !
Jetzt ist ja Wochenende.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0