2016-10-01 92 views
0

フォーラムを1か月以上ストーキングしています。しかし、私は1つの難しさに苦しんでいました。私は実際にここで答えを見つけることができませんでした(他の同様の解決法がありますが、それは私の解決しなかった)。C4477 - フォーマット文字列 '%s'には 'char *'型が必要ですが、可変引数1には 'int'型があります

私の巨大なコードブロックを以下に示す1は、

#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]); 
} 

は今、2ヶ月以上のCプログラミングを学び始め、これは、私は配列を使用しています初めてです。 「printf関数」:フォーマット文字列「%s」は型「のchar *」の引数が必要ですが、可変長引数1「はint型を持つと私はC4477警告

出力ボックスに

を次のエラーメッセージが発生しました'

+0

' "%sを"、文字列[freqstring])' - 何かがここに欠けている... – 4386427

+1

エラーchar配列またはcharポインタを意味する "文字列"を出力したいと主張しています。あなたが与えているパラメータはcharです。配列ではなく、ポインタである。 –

+0

すべてのタイプミスを修正しました。 @SamKuhmonen、しかし、それを 'char string [10]'という名前で宣言していないのは、サイズ文字列のサイズ10の配列でしたか?私の質問が本当にあなたに馬鹿に聞こえたら、すみません。 –

答えて

1

あなたは文字列の概念を誤解しています。

文字列は、ゼロで終了する文字の配列です。その文字列の個々のcharは、まだ整数型です。

したがってstring[freqstring]は整数型です。そしてそれはまさにエラーメッセージが言っていることです。 printfは、%sの使用によりchar*タイプ(別名ストリング)が必要ですが、整数型を指定します。

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

あなたは文字列を求める(%s)が、objectstringは次のとおりです。

がちょうどすなわち、さらに

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

stringを使用し、文字列を取得するには、あなたがスキャンして問題を抱えているようですただ一つのchar。あなたはサイズが8ではないと主張します。定数の代わりにsizeofを使用してください。

実際に文字を読み込み、%sの代わりに%cを使用しましたか?

あなたは文字を読みたい場合は、コードのようなものが考えられます。

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

私は '\ 0'が文字列を終了することを知っています。しかし、他の質問があります。 whileループの3行目はどういう意味ですか?スキャンした文字列の後ろに '\ 0'を追加しますか? なぜ、2番目の部分でforループを実行する必要はありませんか?それはすべてが1つの文字列であるとみなされるような方法でそれを行ったからですか?そしてその文字列を印刷するだけです。 –

+0

ああ、ところで、私の最初の計画は、各行に単語と数字の非常に大きなテキストファイル、つまり_work 10_を作成することでした。だから私はキャラクターをキャラクターにすることが私にとって最良の方法だとは思っていません。私の計画はfscanf_s%s%dにあり、それを配列に格納していたので、ゆっくり配置し、その配列の要素を分析できます。 –

+0

@AndrewWong - あなたの最初のコメント:正しいです、3行目は、文字列に必要なゼロ終了を追加します。次に、文字列全体を一度に印刷することができます。これは、 '%s'がすべてであることです。つまり、ゼロ終了に達するまで文字を出力し続けます。したがって、2番目のループは必要ありません。 2番目のループを使うこともできますが、その場合は、 '%s'ではなく'%c'を使ってその時にcharを出力してください。 – 4386427

関連する問題