Unterschied zwischen %u und %d in scanf()

In C++, wenn ich lese einen integer aus einem string, scheint es, es nicht wirklich wichtig, ob ich u oder d als umwandlungsspezifikator als beide akzeptieren auch negative ganze zahlen.

#include <cstdio>
using namespace std;

int main() {
    int u, d;
    sscanf("-2", "%u", &u);
    sscanf("-2", "%d", &d);
    puts(u == d ? "u == d" : "u != d");
    printf("u: %u %d\n", u, u);
    printf("d: %u %d\n", d, d);
    return 0;
}

Ideone.com

Ich tiefer gegraben, um herauszufinden, ob es da Unterschiede gibt. Ich fand, dass

int u, d;
sscanf("-2", "%u", &u);
sscanf("-2", "%d", &d);

entspricht

int u, d;
u = strtoul("-2", NULL, 10);
d = strtol("-2", NULL, 10);

laut cppreference.com.

Gibt es überhaupt einen Unterschied zwischen u und d wenn Sie diese umwandlungsspezifikationen für das Parsen, d.h. in einem format übergeben scanf-Typ Funktionen? Was ist es?

die Antwort ist Die gleiche für C und C++, richtig? Wenn nicht, ich interessiere mich für beide.

  • %u ist für unsigned und %i unterzeichnet ist.
  • Ich verstehe nicht ganz die Frage, denke ich. Ist nicht die Antwort direkt in der Dokumentation, die Sie miteinander verknüpft?
  • scanf ist C. Wenn du C++ verwendest, verwenden Sie das entsprechende Mechanismus von C++! Sie sind in unterschiedlichen Sprachen. Sagte, dass: RTFM und ermöglichen, dass der compiler Warnungen und achtet auf Sie.
  • scanf ist C-Stil Eingang, aber noch immer in C++. Die Haupt-motivation für diese Frage ist, dass ein hochrangiger Kollege von mir abgelehnt, Teil einer Veränderung von %u auf %i schlug ich vor, als wir anfingen, Annahme der negativen ganzen zahlen. Die codebase ist legacy in verwendet die C-Stil-I/O-alle über dem Platz.
  • Wenn Sie möchten, schreiben C-code, Nutzung von C. Codierung von C-in C++ ist einfach nur schlechter Stil. Sogar mit den identischen syntax, Semantik unterscheiden können.
  • Das ist der Grund, warum ich die Letzte Zeile in meiner Frage, @Olaf. Für meine persönlichen Projekte, die ich verwenden C. Bei der Arbeit, ich Pflege einige alte C++ - code als "C mit Objekten". Ich möchte wissen, die Antwort für beide Sprachen. Code sollte verwendet werden, nicht neu geschrieben. Auch die C++ - quellcodebasis ist zu groß, um den Stil zu ändern. In einem solchen Szenario, die Erhaltung der Konsistenz in Stil wichtiger ist als die Verwendung der besten Stil, IMO. Mixing styles Ursachen der Verwirrung, die verursacht bugs.
  • Obwohl scanf() ist auch erhältlich in C, fragst du nach C++ - code. C++ ist nicht C. ich kenne den Unterschied, @FUZxxl. Ich möchte wissen, die Antwort für beide Sprachen. Siehe meinen letzten Kommentar für die ausführliche Erklärung, bitte.
  • möchten die Antwort für beide Sprachen."—das ist nicht, wie diese Seite funktioniert. Bitte stellen Sie eine Frage zu einer Sprache zu einer Zeit, da Sie sonst erfordern würde, die Menschen, die Ihre Frage beantworten werden, zutiefst vertraut mit den beiden, die unzumutbar ist.
  • "die Erhaltung der Konsistenz in Stil wichtiger ist als mit dem besten Stil" - Nicht wahr, als eine absolute Aussage. Es gibt einen Punkt, eine komplette Neuentwicklung mit Funktionen der Sprache ist besser als das patchen von alten code. Dies gilt aus einer fachlichen und wirtschaftlicher Sicht. Aber als MBAs haben keine Ahnung über die Programmierung (Euphemismus!) und die neue Entwicklung ist ein schwierigeres Buch, als Pflege, Menschen, die Reiten tote Pferde. Ein weiterer Grund sind die Programmierer nicht, neue Dinge zu lernen. Gute Frage-Programmierer in Banken, die zu bewahren die alten Cobol-code, die nie gedacht, dass lange.
  • OK, @FUZxxl. Das macht Sinn. Nun ich Stimme zu, dass diese Frage sollte nur über C++.
  • Komplette Neuentwicklung ist OK, da es bewahrt die Konsistenz, @Olaf. Aber ein umschreiben der Hälfte von einem einzigen Modul unter zig anderen Module geschrieben, mit dem gleichen Stil ist nutzlose Verschwendung von Zeit, wodurch ein hart-zu-erhalten-Codebasis. Aber wir sind immer OT.

InformationsquelleAutor Palec | 2016-02-09
Schreibe einen Kommentar