CPP Dateien inkludieren

Das Forum fĂĽr Programmierer und Systemadmins. Von Shell-, Perl- und PHP-Scripts bis zur objektorientierten Programmierung mit C++.

Beitragvon dfx » Mi 01 Sep, 2004 10:41

TheProdigy hat geschrieben:Falls du etwas per Tastatur einlesen willst, kannst du auch gets() verwenden


einspruch, euer ehren.

BUGS
Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and
because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used
to break computer security. Use fgets() instead.
dfx
Board-User Level 3
Board-User Level 3
 
Beiträge: 1368
Registriert: Do 15 Jan, 2004 19:22
Wohnort: graz

Beitragvon Greg » Mi 01 Sep, 2004 10:54

dfx hat geschrieben:und btw: wenn du in c oder c++ erfolgreich sein willst, solltest du daran arbeiten, dein verständnis von pointern zu verbessern. ;)


Da gebe ich dir recht, ich verstehe dass ĂĽberhaupt nicht, aber niemand kommt als C/C++ Profi auf die Welt ;)

Bei gets() bekomme ich folgende Fehlermeldung beim ausfĂĽhren des Programms:
Bild

Kann mir jemand ein Codebeispiel zu fgets() zeigen....
Greg
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 77
Registriert: So 20 Jul, 2003 21:21

Beitragvon dfx » Mi 01 Sep, 2004 11:06

Code: Alles auswählen
#include <stdio.h>
#include <string.h>

int main(void) {
        char line[128];
        char *newline;

        printf("enter something:\n");
        if (!fgets(line, 127, stdin))
                return 1;
        newline = strchr(line, '\n');
        if (newline)
                *newline = '\0';
        printf("you entered: %s\n", line);
        return 0;
}
dfx
Board-User Level 3
Board-User Level 3
 
Beiträge: 1368
Registriert: Do 15 Jan, 2004 19:22
Wohnort: graz

Beitragvon Greg » Mi 01 Sep, 2004 11:18

Okay, das funktioniert jetzt. Aber:

Wie kommst du bei "if (!fgets(line, 127, stdin))" auf "stdin"?

Wozu braucht man "newline"?
Greg
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 77
Registriert: So 20 Jul, 2003 21:21

c oder c++

Beitragvon ulrich » Mi 01 Sep, 2004 11:20

@greg:
dein quelltext file hat die endung "cpp", daher schlieĂźe ich, daĂź du c++ programmieren willst (anderfalls sollte die endung "c" sein).
da du auĂźerdem gerade beim lernen zu sein scheinst, empfehle ich dir anstatt der c-file manipulations funktionen gleich die entsprechenden c++ streams (fstream, ifstream, ofstream) zu lernen und zu verwenden.

wegen der header - (*.h) - files:
bleiben wir beim beispiel: sichern.h enthält z.B. die deklaration
void sichern();

dann sollte das gesamte include file so aussehen:
#if !defined __SICHERN_H__
#define __SICHERN_H__
void sichern();
#endif

die präprozessoranweisungen verhindern mehrfaches inkludieren derselben deklaration. ohne diese wirst du früher oder später schwierigkeiten bekommen, wenn dein projekt komplexer wird.

und schlieĂźlich wĂĽrde ich empfehlen, zuerst oder begleitend zu den programmierversuchen ein mitteldickes buch ĂĽber c/c++ zu lesen. dieses vorgehen spart enorm viel zeit (verglichen mit reinem experimentieren vor'm monitor - mag zwar seinen reiz haben, ist aber extrem ineffizient)

ulrich
ulrich
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 287
Registriert: Do 13 Nov, 2003 14:27

Beitragvon dfx » Mi 01 Sep, 2004 11:25

Greg hat geschrieben:Wie kommst du bei "if (!fgets(line, 127, stdin))" auf "stdin"?


ist eine globale variable, die eben den stdin (standard input) offen hat.

Code: Alles auswählen
SYNOPSIS
       #include <stdio.h>

       FILE *stdin;
       FILE *stdout;
       FILE *stderr;


Wozu braucht man "newline"?


da fgets das eingetippte "enter" (= newline) mit einliest ("Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer."), muĂź dieses vor ausgabe bzw weiterer verarbeitung wieder entfernt werden. strchr() sucht danach, und falls gefunden wird der string hier abgeschnitten.
dfx
Board-User Level 3
Board-User Level 3
 
Beiträge: 1368
Registriert: Do 15 Jan, 2004 19:22
Wohnort: graz

Beitragvon ulrich » Mi 01 Sep, 2004 11:28

Greg hat geschrieben:Okay, das funktioniert jetzt. Aber:

Wie kommst du bei "if (!fgets(line, 127, stdin))" auf "stdin"?

Wozu braucht man "newline"?


weil offensichtlich der eingelesene string nicht von einem 0-byte ('\0')
begrenzt wird, sonder vom return-tasten-generierten zeichen '\n'

daher muĂź man das letzte zeichen '\n' durch '\0' ersetzen

wenn du nämlich printf("you entered: %s\n", line); aufrufst, und line hat kein '\0' am ende, gibts einen absturz (vermutlich zugriffsverletzung, bestenfalls besteht die ausgabe aus line plus einem haufen mist...)

und wegen dem stdin wĂĽrde ich in der online-hilfe deiner IDE nachsehen...
die sagt folgendes:
char *fgets(char *string, int n, FILE *stream);
stdin bedeutet also, daß du von der tastur lesen willst (könnte auch eine datei sein, oder sonstwas...)

ich empfehle dir aber wirklich, zuerst dein wissen etwas zu vertiefen, bevor du zu programmieren anfänsgt (buch ! :) ) es mag zwar hier immer wieder nette leute geben, die dir weiterhelfen, aber du lernst auf die art halt nicht besonders schnell...

ulrich
ulrich
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 287
Registriert: Do 13 Nov, 2003 14:27

Beitragvon dfx » Mi 01 Sep, 2004 11:34

ulrich hat geschrieben:weil offensichtlich der eingelesene string nicht von einem 0-byte ('\0')
begrenzt wird, ...


wird er schon, nur ist das \0 nach dem \n, somit würde bei einer ausgabe dann eine leerzeile zusätzlich stehen.

ansonsten kann ich mich der empfehlung fĂĽrs buch (oder auch ein online buch) nur anschliessen.
dfx
Board-User Level 3
Board-User Level 3
 
Beiträge: 1368
Registriert: Do 15 Jan, 2004 19:22
Wohnort: graz

Beitragvon Greg » Mi 01 Sep, 2004 12:20

Also ich mache das ganze mit C, nicht mit C++, verwende aber immer *.cpp
Greg
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 77
Registriert: So 20 Jul, 2003 21:21

Beitragvon ulrich » Mi 01 Sep, 2004 13:08

@greg:
das solltest du nicht, da u.u. die IDE aufgrund der endung (c oder cpp) gewisse entscheidungen trifft (evt. compiler flags, function calling conventions, o.ä. - hatte auf jeden fall mal ziemliche probleme deswegen)

@dfx:
wird er schon, nur ist das \0 nach dem \n, somit würde bei einer ausgabe dann eine leerzeile zusätzlich stehen.

aha - bin hier nicht _der_ experte, da ich für i/o ganz auf die c++ streams eingestellt bin (und würde anstatt char[] sowieso immer std::string verwenden, wann immer möglich ;))

ulrich
ulrich
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 287
Registriert: Do 13 Nov, 2003 14:27

Beitragvon dfx » Mi 01 Sep, 2004 13:39

ulrich hat geschrieben:@greg:
das solltest du nicht, da u.u. die IDE aufgrund der endung (c oder cpp) gewisse entscheidungen trifft (evt. compiler flags, function calling conventions, o.ä. - hatte auf jeden fall mal ziemliche probleme deswegen)


richtig, denn eine funktionsdeklaration mit char fileread(char filename[100]="") ist c++. c kennt keine defaultwerte für funktionsparameter und der compiler würde einen schönen syntax error ausspucken.
dfx
Board-User Level 3
Board-User Level 3
 
Beiträge: 1368
Registriert: Do 15 Jan, 2004 19:22
Wohnort: graz

Beitragvon TheProdigy » Do 02 Sep, 2004 11:06

Lern lieber gleich C++ ;)

Hier ein Link zu den Unterlagen einer C++-Anfänger-Vorlesung auf der TU-Graz: http://courses.iicm.edu/programmierpraktikum/skriptum/

HTH
TheProdigy
Board-Mitglied
Board-Mitglied
 
Beiträge: 101
Registriert: Mi 05 Mai, 2004 10:41

Vorherige

ZurĂĽck zu PROGRAMMIER FORUM

Wer ist online?

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