Warnung bei Turbo C
-
Ein herzliches Hallo an die c-plusplus Community(Ich bin neu hier)
Ich bekomme eine Warnung bei folgendem Programm:
#include <stdio.h>
int main()
{
char *name;
printf ("Geben Sie Ihren Vornamen ein: ");
scanf ("%s",name);
printf ("Ihr Vorname enthaelt %d Zeichen.",strlen(name));
}Die Warnung lautet:
Warning: Possible use of "name" before definition in function mainDabei wird die Stelle hinter dem Semicolon in der scanf Zeile markiert.
Natürlich funktioniert das Programm auch nicht.
Es erscheint nur ein Fenster mit dem Text: "Geben Sie Ihren Vornamen ein"Wenn ich das dann mache und Enter drücke verschwindet das ganze Fenster.
Es gibt auch noch eine zweite Warnung allerdings weiss ich nicht wie ich die lesen kann
-
Hallo,
scanf übergibt man besser keinen uninitialisierten Zeiger(name), sondern sorgt auch noch für gültigen Speicher, auf den name dann zeigt:
#include <stdio.h> int main() { /* 255 Zeichen fuer einen Namen vorsehen */ char name[255]; printf ("Geben Sie Ihren Vornamen ein: "); scanf ("%s",name); printf ("Ihr Vorname enthaelt %d Zeichen.",strlen(name)); }
MfG
-
btw.
a) solltest du noch string.h inkludieren, da strlen darin deklariert wird
b) scanf("%s\n",name); wird dich wenn du mehrere Eingaben machen willst vor einer bösen Überraschung bewahren (nämlich einem nicht leeren Tastatur Buffer)
c) Ist der Turbo C nicht mehr das neueste. Wenn du einen extrem guten freien Compiler für Windows suchst, dann nimm den MinGW. Für DOS gibt es den DJGPP (sind beides GCC Portierungen)
d) und in C musst du ein explizites return angeben
-
Da bekommst du aber auch nen schönen Buffer-Overflow, wenn der User mehr als 254 Zeichen eingibt. Am besten, du nimmst fgets für solche Sachen:
char buf[255]; printf("Bitte geben Sie ihren Vornamen ein: "); fgets(buf, 255, stdin);
Mit scanf geht es auch, hier liest er bis zum nächsten Leerzeichen/Tabulator/Newline/EOF...
char buf[255]; printf("Ihr Vorname: "); scanf("%254s", buf);
-
kingruedi schrieb:
d) und in C musst du ein explizites return angeben
nein, dies war/ist weder nach "altem" noch nach aktuellem ANSI-C-Standard erforderlich.
MfG