dポイントプレゼントキャンペーン実施中!

strtokの問題というよりも、文字列とポインターの考え方がまだちゃんと分かってないせいだとは思うんですが、strtok()のところで、Access Violationとでます。すごく単純そうな問題だとは思いますが、教えてください。お願いします。

#include <iostream.h>
#include <string.h>

int main() {

char *chk = "3453/5252";
char *tokenPtr;

tokenPtr = strtok(chk, "/");

while (tokenPtr != NULL) {

tokenPtr = strtok(NULL, "/");
}
return 0;
}

A 回答 (5件)

> 静的なバッファ…


 "変数領域" に確保する配列のことです。例えば、関数の外で定義した配列は "静的" になります。(関数内で定義することもできますが…詳細は割愛します)

> ポインターとはconst array …
 この場合の "3453/5252" は "定数領域" にありますので const になります。ですので char *chk = "3453/5252" とすると chk に代入されるのは const ポインタです。
 関数内で char chk[] = "3453/5252" とすると、文字列はスタック上の領域(auto 変数)にコピーされ、chk にはその領域を指すポインタが代入されます。これは const ではありません。

> chkにはユーザーが入れた値を代入したいので…
 いずれにしても入力された文字列を蓄えておく領域(文字配列・バッファ)は必要でしょうし、予想される文字数が十分入るサイズを確保した上で、文字数超過でバッファがあふれないようにする対策も避けて通れないと思います。
    • good
    • 0
この回答へのお礼

route156さん、deagleさん、分かりやすい説明をしてくださって、ありがとうございました。ポインターと配列に関する疑問が、もうそろそろ解けそうな気がしてきました。本当にありがとうございました。

お礼日時:2002/03/18 23:11

 これは変数 chk を定義するときに一緒に文字列を代入してしまっているのが原因です。


 これは route156 さんがおっしゃっているのと同じことです。
 しかし、

  char chk[] = "123";
  char *chk = "123";

 この2つは同じ意味なので、実際にはこうしなければいけません。

  char chk[10];
 strcpy( chk, "123/456" );

 これならば、chk の中身が改変可能になるのでエラーは出ません。

 で、上記の例では [10] というふうに文字列の長さを固定してしまっていますが、このような宣言の変数を「静的変数」といいます。
 逆に、

  char *chk;
  chk = (char*)malloc(10);

 というように、文字列の長さをプログラム内で可変的に作成した変数を「動的変数」といいます。

 なお、C言語では、「文字列の長さを決めずに処理をする」のは不可能です。もしそれをやりたければC++の CString などを使わなければいけません。
 これは、C言語がもともと、「システムを直接操作する」ことを目的とした言語だからです。
    • good
    • 0

 strtok() は与えられた文字列内の区切り文字の部分に '\0' を書き込みますので、Access Violation は定数として文字列を与えているのが原因だと思います。


 文字列を収める場所を別に確保してみてはどうでしょう。

int main(void)
{
 char chk[] = "3453/5252";
 …以下略

※ malloc() を使っても、静的なバッファに strcpy() しても良いと思います。

この回答への補足

実は、chkにはユーザーが入れた値を代入したいので、配列を使うとなると、要素の大きさを決めなければいけなくなりどこかでエラーになるような気がするのです。後もう二つ質問させてください。

静的なバッファとはなんでしょう?

どこかで聞いたことがあるのですが、ポインターとはconst arrayなのでしょうか?

補足日時:2002/03/14 12:37
    • good
    • 0

ごめんなさい。

No.1は無視して下さい。
勘違いしました。
で、あれ?おかしいところは見当たりませんけれど。
ひょっとして、strtok()の入っているダイナミックライブラリの
アクセス権がないとか...。

この回答への補足

ダイナミックライブラリとはDLLのことですか?ネットワークに繋がれてない、WIN98で動かしているので、アクセス件の問題ではないと思うのですが。。。

補足日時:2002/03/14 12:01
    • good
    • 0

strtok(NULL, "/")


は何を意図しているのでしょう。
明らかに第1引数のNULLが問題ですが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!