Buchstabe einlesen und wieder ausgeben



  • (Ich antworte mal in diesen Thread.)

    Du verwendest scanf_s falsch (ob du es überhaupt verwenden sollst, ist eine andere Frage). Da du Informatik studierst, wäre es auch sehr sinnvoll sich anzueignen, Dokumentationen/Referenzen zu lesen.

    Auf http://msdn.microsoft.com/en-us/library/w40768et.aspx steht nämlich:

    Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c, C, s, S, or string control sets that are enclosed in []. The buffer size in characters is passed as an additional parameter immediately following the pointer to the buffer or variable.

    Und weiter unten:

    In the case of characters, a single character may be read as follows:

    char c;

    scanf_s("%c", &c, 1);



  • Super, vielen Dank!
    Wenn ich das jetzt richtig gelesen habe, geht's um die Speicherzuweisung. Ich habe bei meinem scanf_s noch eine 1 hinten angehängt und somit funktioniert's!



  • areimund schrieb:

    Wenn ich das jetzt richtig gelesen habe, geht's um die Speicherzuweisung. [...]

    Es geht darum, daß scanf_s wissen will, wie groß der übergebene Puffer ist, um sicherstellen zu können, nicht über dessen Länge hinaus zu schreiben und damit einen Buffer overflow ausschließen zu können. Bei scanf() dagegen kann soetwas passieren.



  • volkard schrieb:

    Das scheint mir C zu sein. Haste C gemeint?

    Naja, es entspricht zumindest keinem C-Standard.



  • wenn ich den Befehl scanf(); verwende schimpft Visual Studio:
    "error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."

    Und auch unser Prof meinte wir sollen einfach scanf_s() verwenden.

    Bitte entschuldigt wenn ich noch nicht so gefestigt bin, aber wir hatten erst 4 Programmieren Vorlesungen.



  • Okay, wenn du eine andere Funktion benutzt, musst du natürlich auch ansehen, was sie als Parameter erwartet. Kann ja ganz was anderes sein.

    Und verlern bitte schnell wieder das "void main". Das ist nämlich kein C und kein C++. Es ist und war schon immer "int main". Siehe auch hier: http://www.c-plusplus.net/forum/39346



  • Ok! super, Danke!
    Komisch, dass das dann bei vielen Beispielen von unserem Prof. so drin steht... 😕



  • areimund schrieb:

    Komisch, dass das dann bei vielen Beispielen von unserem Prof. so drin steht... 😕

    Tausche bitte gerne ein "komisch" gegen ein "traurig".



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Komisch, dass das dann bei vielen Beispielen von unserem Prof. so drin steht... 😕

    Schminke dir ab, bei Professoren Programmieren zu lernen.
    Das dort ist dilettantisches Geschwätz, ebenso wie bei den meisten Fachbüchern und Tutorials.

    Und nachdem meines Wissens nach C eine "Untermenge" von C++ ist, habe ich nicht weiter nachgedacht.

    Und hier siehst du es dann schon: Blödsinn und eine unzulässige Verallgemeinerung von Stümpern.

    "error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."

    Und warum machst du nicht das, was der Compiler dir empfiehlt?
    Merke: Der Compiler hat immer recht, im Gegensatz zu deinem Professor.
    Also für VStudio immer am Beginn:

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    ...
    

    wobei _CRT_SECURE_NO_WARNINGS KEIN Standard ist sondern MS spezifisch.

    Und auch unser Prof meinte wir sollen einfach scanf_s() verwenden.

    Und wieder dummes Professorengeschwätz.
    Für das Lesen eines Zeichens von stdin gibt es die Standardfunktion getchar() (returniert ein int und kein char), oder allgemeiner fgetc.

    sorry... ja im Moment programmieren wir noch in C, beim Anlegen einer Projektmappe in Visual Studio wird aber immer Visual C++ genommen.

    Das ist wahr, lässt sich aber durch Umbenennen deiner *.cpp in *.c Datei oder durch Compilerschalter /TC korrekt einstellen.

    Naja, es entspricht zumindest keinem C-Standard.

    scanf_s ist Standard, nämlich C11.
    MS baute dieses unselige "Sicherheitsfeature" zuerst in seine Compiler ein, und drückte es dann wahrscheinlich über Sutter als ISO WG21-Chef (C++) ins WG14 (C).
    Wie kann man nur Sicherheitsfeatures in variadische Funktionen einbauen?
    Das Ergebnis sieht man an dem o.g. Trivialbeispiel.

    Microsoft:
    int scanf_s(const char * format, ... );
    C11 Standard:
    int scanf_s(const char * restrict format, ...);
    

    Da VStudio 2014 mittlerweile endlich C99 unterstützt (und damit restrict), bin ich mal gespannt, wann sie merken, dass ihre bisherige Dokumentation das restrict benötigt um wenigstens als Vorgriff auf C11 kompatibel zu sein.



  • Wutz schrieb:

    Naja, es entspricht zumindest keinem C-Standard.

    scanf_s ist Standard, nämlich C11.

    Von mir gemeint war "void main".


Anmelden zum Antworten