OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

strtok

  • すぐに回答を!
  • 質問No.234891
  • 閲覧数378
  • ありがとう数1
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 27% (30/110)

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;
}
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.5
レベル10

ベストアンサー率 85% (93/109)

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

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

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

お礼率 27% (30/110)

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

その他の回答 (全4件)

  • 回答No.1
レベル13

ベストアンサー率 24% (357/1463)

strtok(NULL, "/") は何を意図しているのでしょう。 明らかに第1引数のNULLが問題ですが。
strtok(NULL, "/")
は何を意図しているのでしょう。
明らかに第1引数のNULLが問題ですが。


  • 回答No.2
レベル13

ベストアンサー率 24% (357/1463)

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

お礼率 27% (30/110)

ダイナミックライブラリとはDLLのことですか?ネットワークに繋がれてない、WIN98で動かしているので、アクセス件の問題ではないと思うのですが。。。
投稿日時 - 2002-03-14 12:01:21
  • 回答No.3
レベル10

ベストアンサー率 85% (93/109)

 strtok() は与えられた文字列内の区切り文字の部分に '\0' を書き込みますので、Access Violation は定数として文字列を与えているのが原因だと思います。  文字列を収める場所を別に確保してみてはどうでしょう。 int main(void) {  char chk[] = "3453/5252";  …以下略 ※ mall ...続きを読む
 strtok() は与えられた文字列内の区切り文字の部分に '\0' を書き込みますので、Access Violation は定数として文字列を与えているのが原因だと思います。
 文字列を収める場所を別に確保してみてはどうでしょう。

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

※ malloc() を使っても、静的なバッファに strcpy() しても良いと思います。
補足コメント
northcurlcurl

お礼率 27% (30/110)

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

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

どこかで聞いたことがあるのですが、ポインターとはconst arrayなのでしょうか?
投稿日時 - 2002-03-14 12:37:04
  • 回答No.4

 これは変数 chk を定義するときに一緒に文字列を代入してしまっているのが原因です。  これは route156 さんがおっしゃっているのと同じことです。  しかし、   char chk[] = "123";   char *chk = "123";  この2つは同じ意味なので、実際にはこうしなければいけません。   char chk[1 ...続きを読む
 これは変数 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言語がもともと、「システムを直接操作する」ことを目的とした言語だからです。
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ