Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

GMoney597

Frischling

  • »GMoney597« ist der Autor dieses Themas

Beiträge: 48

Wohnort: Roth

Beruf: Verwaltungsfachangesteller (Stadtverwaltung), Fitness-Trainer und Muay-Thai-Trainer

  • Private Nachricht senden

1

02.06.2014, 18:13

Scanf und Cin mit einer Variablen

Hey Leute,
ich stelle mich mal wieder echt doof an, wie ich meine

Folgendes Problem habe ich mir gelegt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;

int main()
{
string name;

printf ("Bitte einen Namen eingeben: ");
scanf ("%s", &name);
printf ("Du hast %s eingegeben.\n", &name);

cout << "Bitte gib einen weiteren Namen ein: ";
cin >> name;
cout << "Du hast " << name << " eingegeben." << endl;

cin.get();
return 0;
}


Ich habe nämlich eine Aufgabe im Netz gefunden, die die Eingabe und Ausgabe eines Namens per scanf/printf und cin/cout fordert.

Als Fehlermeldung erhalte ich stets nach Eingabe des zweiten Namens "Segmentation fault" unter g++.
Ich habe einiges versucht aber scheitere immer an dieser Stelle.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

02.06.2014, 19:18

Kurze Erklärung:
C-Funktionen funktioniert nicht mit "std::string".
Leg einen Buffer an oder besser, nutze die C++-Funktionen außer in ganz speziellen Fällen, wenn du genau weißt, was du machst.

Lange Erklärung:
Die C-Funktionen nutzen ein sehr wildes und beschränktes Sprachfeature um Funktionen mit einer beliebigen Anzahl Parameter zu realisieren:
Die einfache Übergabe der Daten als "Byterepräsentation" auf den Stack. Dabei können keine Typinformationen mit an den Aufgerufenen("std::scanf" oder "std::printf") übergeben werden. Diese werden zb. aus den Parametern rekonstruiert. "%s" steht für einen C-String(Das heißt konkret, ein einfacher Zeiger auf einen Char-Buffer), du übergibst jedoch einen Zeiger auf einen C++ String an die Funktion, welcher fundamental anders aufgebaut ist. Die Funktion denkt, es wäre ein C-String, was natürlich nicht funktioniert, weil es keiner ist. Aber das weiß die Funktion eben leider nicht, wie oben erklärt. Das liegt an den verrückten Eigenheiten dieses uralten C-Features, wovon ebenfalls eine Folge ist, dass nichtmal der Compiler ein Warnung ausgelösen kann. Ein paar ganz besonders intelligente Compiler, können in einige Fällen davor warnen. Wenn man die Funktionen also trotzdem nutzen will, ist es eine einfache Möglichkeit sicheheitshalber "-Wformat=2" anzuwenden, dann sollte der GCC in einigen Fällen davor warnen. Dadurch und das man für "std::scanf" einen Buffer selbst anlegen muss und selbst verwalten, kann man von der Funktion eigentlich nur abraten. "std::printf" ist nicht ganz so kompliziert richtig zu verwenden wie "std::scanf". Das an der "std::printf" wäre für sich genommen zumindest einfach zu lösen, weil man aus dem C++ String mit der "c_str()"-Funktion einen konstanten C-String bekommen kann.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (02.06.2014, 22:17)


GMoney597

Frischling

  • »GMoney597« ist der Autor dieses Themas

Beiträge: 48

Wohnort: Roth

Beruf: Verwaltungsfachangesteller (Stadtverwaltung), Fitness-Trainer und Muay-Thai-Trainer

  • Private Nachricht senden

3

03.06.2014, 07:38

Eine wunderbare Erklärung, die habe sogar ich verstanden, danke dafür.

Grundsätzlich will ich auch kein C programmieren sondern C++ aber wie beschrieben habe ich so eine Aufgabe gefunden und wollte mal wissen, wie es läuft.
Ich war schon mit der Programmierung der Lösung äußerst unzufrieden, weil dieses C echt mega-kompliziert zu lesen ist, in meinen Augen.

Aber Danke jedenfalls, solche Aufgaben werde ich künftig einfach nicht mehr lösen wollen :-D :-D :-D

Gruß
Toni

Werbeanzeige