2016-06-06 18 views
1

Ich habe ein Problem mit der Konsoleneingabe. Wenn ich cin verwende funktioniert es perfekt, aber wenn ich scanf benutze, funktioniert es nicht. Ich löschte alle Sachen, die nicht wichtig ist, und hier ist das Programm:C++ Eingabe mit scanf

#include <bits/stdc++.h> 

using namespace std; 

int n; 
char c, t; 
char a[81][81]; 
int main() 
{ 
    cin >> n; 
    for(int i = 0;i < n; ++i) 
     for(int j = 0;j < n; ++j) 
     { 
      scanf("%c", a[i][j]); 
     } 
    for(int i = 0;i < n; ++i) 
     for(int j = 0;j < n; ++j) 
     { 
      cout <<a[i][j] << " "; 
     } 
    return 0; 
} 

Das Problem ist, dass, wenn ich es mit dem Eingang wie folgt testen:

2 
t t t t 

Es sollte Ausgabe:

t t t t 

Aber stattdessen gibt er dies:

t t 
+0

Willkommen bei Stack Overflow! Wenn Sie sagen "es funktioniert nicht", seien Sie bitte sehr spezifisch: Sie sollten mindestens sagen, was Ihre Eingabe war, was die erwartete Ausgabe war und wie sich die tatsächliche Ausgabe davon unterschied. – dasblinkenlight

+2

'#include ' O_O – Drop

+1

Schalten Sie die Compiler-Warnungen ein. Der Compiler sollte Ihnen sagen, was falsch ist. – chris

Antwort

1

Sie müssen dies:

scanf("%c", &a[i][j]); 

statt dessen:

scanf("%c", a[i][j]); 

WARUM?

Nun, scanf soll eine Schreib auf die Variable auszuführen (n) (mit Ausnahme der Format-String) übergeben. In C war es nur durch Zeiger möglich. Daher müssen Sie übergeben Adressea[i][j]

Warum funktioniert es für cin>>? Nun, C++ hat Referenzen eingeführt, und n ist als int& nicht nur int übergeben. cin ist vom Typ std::istream (eine Klasse) mit operator>> implementiert. Wenn Sie das tun:

cin >> n; 

Es übersetzt als:

cin.operator>>(n); 

Wo n als int&

2

geben Sie verwenden können:

char c; 
std::cin >> c; 

und erwarten, um den Wert zu sein, Lesen Sie in c seit dieser Funktionsaufruf arbeitet mit einem Verweis t o eine char. Die Funktion Signatur entspricht:

std::istream& operator>>(std::istream& is, char& c); 

jedoch

char c; 
scanf("%c", c); 

nicht funktioniert, da scanf einen Zeiger auf eine char erwartet. Daher müssen Sie verwenden;

scanf("%c", &c); 

Was bedeutet das für Ihren Code?Sie verwenden müssen:

scanf("%c", &a[i][j]); 
+1

Diese Antwort vermisst das grundsätzliche Problem, das das op erfährt - nämlich das automatische Löschen von Leerzeichen durch "operator >>". –

1

Es gibt einen fundamentalen Unterschied zwischen scanf("%c") und operator>>

Dieses Programm ist zeigt es:

#include <iostream> 
#include <sstream> 


int main() 
{ 
    std::cout << "with operator >>" << std::endl; 

    std::istringstream ss(" t t "); 
    char c; 
    while (ss >> c) 
     std::cout << "[" << c << "]" << std::endl; 

    std::cout << "with scanf" << std::endl; 
    auto str = " t t "; 
    for (int i = 0 ; i < 5 ; ++i) 
    { 
     char c; 
     if (sscanf(str + i, "%c", &c)) { 
      std::cout << "[" << c << "]" << std::endl; 
     } 
    } 
} 

erwartete Ausgabe:

with operator >> 
[t] 
[t] 
with scanf 
[ ] 
[t] 
[ ] 
[t] 
[ ] 

Beachten Sie, dass operator>> ist Entfernen von Whitespac e (dies ist das Standardverhalten eines C++ std::basic_istream<> und kann deaktiviert werden).

Beachten Sie, dass sscanf keine Leerzeichen für den Operator %c entfernt.

Aus der Dokumentation von% C:

paßt ein Zeichen oder eine Folge von Zeichen

Im Gegensatz zu% s:

eine Folge von nicht übereinstimmt Leerzeichen Zeichen (eine Zeichenfolge)

Ein Leerzeichen ist ein Zeichen. Es ist auch ein Leerzeichen.

source: http://en.cppreference.com/w/cpp/io/c/fscanf