2

これは私のコードです:

char str[] ="";
scanf("%s",&str);
char * pch;
pch = strtok (str,"#");
printf ("%s\n",pch);
return 0;

「1#2#3」の入力を1番目、2番目、3番目の3つの整数にレンダリングする必要があります。上記の私のコードは最初の変数のみに取り組み、最初の文字列「1」を出力しますが、それをint変数に保存したいと思います。

私は試した:

int first = atoi(&pch)

しかし、「最初の」は1ではなく値0を取得します。配列charのポインターをintに解析するにはどうすればよいですか?

4

4 に答える 4

4

str入力を処理するのに十分な大きさがないため、コードの動作は未定義です。str最大 1 を保持できcharscanf()文字列を読み取るときに null ターミネータを追加します。ユーザーが単一の文字を入力してリターンをヒットscanf()すると、配列の境界を超えて書き込まれますstr

修正するには、許容できる文字列の最大長を決定し、scanf()さらに読んで防止します。

char str[1024];
if (1 == scanf("%1023s", str))
{
}

はfor 無効な入力または foratoi()の結果を生成することに注意してください。これは役に立ちません。代わりに使用するか、dasblinkenlight からの回答を参照してより簡単な解決策を見つけてください。0"0"strtol()

于 2012-10-24T13:16:01.897 に答える
4

入力の正確なレイアウトと s の正確な数がわかっている場合は、intこれを大幅に簡略化できます。

scanf("%d#%d#%d", &a, &b, &c);

これはideone のデモへのリンクです

于 2012-10-24T13:16:20.520 に答える
1

char*aではなく atoi() にaを渡しchar**ます。次のように呼び出すだけですatoi(pch)

于 2012-10-24T13:16:14.203 に答える
0

str を char str[] =""; として宣言しました。これにより、str に 1 バイトのみが割り当てられます。正しく動作していますか。ここで何かが欠けていないことを願っています。
strtokに関しては、whileループで使用する必要があります
pch = strtok (str,"#");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, "#");
}

于 2012-10-24T13:17:51.163 に答える