2016-10-01 5 views
0

Ich habe die Foren seit mehr als einem Monat verfolgt und es hat Antworten auf die meisten meiner Fragen. Aber ich habe mich durch eine Schwierigkeit gekämpft, die ich nicht wirklich die Antwort hier finden konnte (es gibt andere ähnliche Lösungen, aber es hat meine nicht gelöst)C4477 - format string '% s' benötigt typ 'char *', aber variadic argument 1 hat den typ 'int'

Ich habe versucht, meinen riesigen Codeblock zu vereinfachen ein unten,

#define DATA_ROW 1 /*I have one data per line*/ 


int freqstring; 
char objectstring; 
char string[10]; 
FILE * file; 


freqstring = 0; 
while (fscanf_s(file, "%s", &objectstring, 8) == DATA_ROW) 
{ 
    string[freqstring] = objectstring; 
    freqstring = freqstring + 1; 
} 

for (freqstring = 0; freqstring < 10; freqstring = freqstring + 1) 
{ 
    printf("%s", string[freqstring]); 
} 

gezeigt gestartet jetzt C-Programmierung für über 2 Monate zu lernen, und dies ist das erste Mal, dass ich Arrays bin. Und ich habe die folgende Fehlermeldung im Ausgabefeld angetroffen

C4477 Warnung: ‚printf‘: Format-String ‚% s‘ erfordert ein Argument vom Typ ‚char *‘, aber variadische Argument 1 hat ‚int Typen '

+0

' "% s", string [freqstring])' - etwas fehlt hier ... – 4386427

+1

Der Fehler ist ziemlich klar: Sie behaupten, dass Sie eine "Zeichenkette" drucken wollen, dh ein Char-Array oder einen Char-Pointer. Der Parameter, den Sie geben, ist ein Zeichen. Kein Array, kein Zeiger. –

+0

Ich habe alle Tippfehler korrigiert. @SamiKuhmonen, aber deklariert es nicht als 'char string [10]' machte es ein Array mit Namenstring, mit der Größe 10? Es tut mir leid, wenn meine Frage für Sie wirklich dumm ist. –

Antwort

1

Sie haben ein gewisses Missverständnis des String-Konzepts.

Ein String ist ein nullterminiertes Array von Zeichen. Das einzelne Zeichen in dieser Zeichenfolge ist immer noch ein ganzzahliger Typ.

So string[freqstring] hat Integer-Typ. Und genau das sagt die Fehlermeldung. Die printf erwartet einen char* Typ (aka String) aufgrund der Verwendung von %s, aber Sie geben es einen Integer-Typ.

die Zeichenfolge zu erhalten, nur string verwenden, dh

printf("%s\n", string); 

Weiterhin scheint es Probleme mit dem Scannen haben:

fscanf_s(file, "%s", &objectstring, 8) 

Sie fragen nach einer Zeichenkette (%s) aber objectstring ist nur eine einzige char. Sie behaupten, die Größe ist 8, die es nicht ist. Verwenden Sie sizeof statt einer Konstante.

Haben Sie wirklich vor, Zeichen zu lesen, dann verwenden Sie %c anstelle von %s.

Falls Sie wollen Zeichen lesen, wird der Code so etwas wie sein könnte:

freqstring = 0; 
string[freqstring] = '\0'; 
while ((fscanf_s(file, "%c", &objectstring, sizeof(char)) == 1) && 
     (freqstring < 9)) 
{ 
    string[freqstring] = objectstring; 
    freqstring = freqstring + 1; 
    string[freqstring] = '\0'; 
} 

printf("%s\n", string); 
+0

Ich weiß, dass '\ 0' die Zeichenfolge beendet. Aber ich habe andere Fragen, Was genau bedeutet die dritte Zeile in der While-Schleife? Fügt es hinter der Reihe von Zeichen, die ich gescannt habe, ein "\ 0" hinzu? Und warum muss ich nicht die for-Schleife auf dem zweiten Teil tun?Ist es, weil Sie es so gemacht haben, dass alles als eine Saite betrachtet wird? Und alles, was Sie tun müssen, ist diese Zeichenfolge zu drucken? –

+0

Oh, und übrigens, mein ursprünglicher Plan war, eine sehr große Textdatei mit Wörtern und Zahlen in jeder Zeile zu erstellen, d. H. _work 10_. Ich denke also nicht, dass es für mich der beste Weg wäre, Charakter für Charakter zu bekommen, da mein Plan war, fscanf_s% s% d zu speichern und in ein Array zu speichern, damit ich langsam die Elemente in diesem Array arrangieren und analysieren kann. –

+0

@AndrewWong - Für Ihren ersten Kommentar: Korrekt, die dritte Zeile fügt die Null-Terminierung hinzu, die für eine Zeichenfolge erforderlich ist. Dann können Sie die gesamte Zeichenfolge auf einmal ausdrucken. Das ist es, worum es bei "% s" geht, d. H. Drucke Zeichen weiter, bis eine Null-Beendigung erreicht ist. Ihre zweite Schleife wird also nicht benötigt. Sie könnten die zweite Schleife verwenden, aber in diesem Fall sollten Sie ein Zeichen zu der Zeit mit '% c' anstelle von '% s' drucken. – 4386427

Verwandte Themen