CS+ strtokの動作がおかしい?

お世話になります

strtokの動作ですが

int main(void)
{
        char str[] = "ABCD ef.1234.G";
        char *tp;

        /* スペース.を区切りに文字列を抽出 */   
        tp = strtok( str, " ." );
        puts( tp );
        while ( tp != NULL ) {
                tp = strtok( NULL," ." );
                if ( tp != NULL ) puts( tp );
        }
        
        return 0;
}

【実行結果】

ABCD
ef
1234
G
であろうと思います、が区切り\0が出力されません(下記ダンプは下を実行後です)
FFF049AE 39 36 30 30 20 45 20 38 : 20 31 00 20 2C 0D 09 00 9600 E 8 1 ,
FFF049BE 25 73 20 25 73 20 25 73 : 20 25 73 0D 00 20 2E 2C %s %s %s %s .,
str[strlen(str)]=' ';
str=strtok(str," ,\r\t");
本来ならば39 36 30 30 00 45 であると思うのですが
昨今のエラー発生で
_s1ptr=NULL; // Remove the comment when you use strtok()
(E) E0562310 E0562310:Undefined external symbol "__s1ptr" referenced in "DefaultBuild\resetprg.obj" gen.mtpj
_s1ptr=NULL;をコメントアウトにしていることが関係しているのでしょうか?
教えていただけないでしょうか、よろしくお願いします。
  • わわいです
    質問がいまいち意味不明ですが、なにを聞きたいのでしょうか?
  • わわいさん
    まず先日
    _s1ptr=NULL; // Remove the comment when you use strtok()
    これを入れるとエラーがでるので
    //_s1ptr=NULL; // Remove the comment when you use strtok()
    このようにコメントアウトして使用しております、これは説明のとうりstrtok()を使用する場合に必要
    というような説明がされております、これは先日の質問提起の内容でした
    今回の問題はそれが関連しているのではないかと思っております
    1.strtokそのものは使用できている
    2.strtok()動作も概略できている
    3.strtok()から取り出したトークンにデリミタが無い(これが不都合)
    以上です、よろしくお願いします。
  • わわいです
    えーと、まだ質問内容がよ~わかってませんが、、
    >3.strtok()から取り出したトークンにデリミタが無い(これが不都合)
    なにがどうなるはずがどーなってるのかを詳しく説明してくれませんか
  • わわいさん
    わわいさん頼りの綱です、よろしくお願いします。
    strtokの動作をご説明します
    strtokとは複数のトークンがつながった一文を単独のトークンに分離します
    以下_(アンダーバーはスペースだと思ってください)
    *str が"abc_123_456"の一文です
    ここでstr=strtok(str,"_");を実行すると
    strにはabcの先頭(aの文字)になります
    それとともに文字列"abc_123_456"は"abc*123_456"
    abc*(*は0)になります
    つまりstrは"abc_123_456"ではなく"abc"になります
    その次にstr=strtok(NUL,"_");を実行すると
    strは"123"になります
    その次にstr=strtok(NUL,"_");を実行すると
    strは"456"になります
    以上です、お判りでしょうか
    今現在不都合というのが
    このように分離されず
    "abc_123_456"
    "123_456"
    "456"
    このようになりますから、一番最後のみ正常?
    処で_s1ptrの変数ですが
    tool-support.renesas.com/.../ccrx08c0302y.html
    によりますと、
    _s1ptr=NULL; // strtok関数を使用する場合の初期設定です
    に説明しており、必要であると書いてあります
    私も自分のPCの中のHewを含めてこれまでの全てのH8やらSHやらファイルを調べましたが
    このような定義は一切出てきません、自分で解析するのは不可能じゃないのでしょうか。
  • なんとサンプルコードの中にstrtokが使用していないか探しても、使用している箇所が見つかりませんでした、
    もしかしたら不都合ありかも。
  • わわいです
    strtok でぐぐると、この関数の解説が山ほど出てきますが、そのどこにも、元文字列バッファがどうなるかは書かれていません。
    あくまで、strtok関数の戻り値がこうなる、というものです。
    だもんで、元の文字列バッファが、この関数実行後にどうなるか、ってのは期待してはいけないものと判断しますがどーでしょうか。
    #あえて規格書などは読まないでコメントしてますw
    あなたが期待する結果にならなければいけない、と解説している資料などはあるのでしょうか?

    で、あなたが提示している資料ですが、それはあくまで初期化のやり方について解説している資料のように思えます。
    必ずそれを実行しなければいけない、というたぐいのものではないように思いますが。
    _s1ptr 変数は、あくまでstrtok関数の内部で使用しているというだけで、必ず初期化しなければならないものではないですね。
  • わわいさん
    お疲れさまです、世の中なかなか大変でして、
    えーと、C言語の規格、私が考えたものじゃないです(あたりまえじゃー)
    それによると、以下を引用します(適当です)
    strtok() の 1 回目の呼び出しで、文字列は字句と区切り文字に分割される。strtok() 関数は、区切り文字が最初に現れるところまでを解析し、区切り文字を null バイト('\0')に置き換え、その字句の 1 文字目のアドレスを返す。strtok() の 2 回目以降の呼び出しでは、直前で呼び出しで置いた null 文字の直後から解析を開始する
    まあしかし私の問題で済めばいいのですが、CS+を使用している人は沢山いますので、もしですが同じ問題があるとすれば、大変なことで、もし問題があるとすれば修正しなければいけないと思います、でもその前に
    srand(1); // rand関数を使用する場合の初期設定です
    と言っておきながら、エラーになるのはどうしてか?
    必要ないなら最初から削除してあれば良いでしょう、ということです
    以上ですが、私も初心者でうまく行くように、アドバイスしてくださることをお願いしています。
  • わわいです
    まあ、それはあなたの解釈がおかしい、としかいいようがないですね。

    >と言っておきながら、エラーになるのはどうしてか?
    えーと、ワーニングは出るもののエラーにはなってないと思いますが。
  • わわいさん
    本当にお世話になります、今使用しているコンパイラーが購入品なので、不都合があるとすれば販売店にでもクレーム付けることが出来ますが、まあできれば早く気が付いていただき、修正していただくのが良いのではと思いますstrtokぐらいなら自分でも作成して間に合わすことができますが、それよりも心配なのがCS+のRXコンパイラーにはこういうことがあると、これから使用したいと思う人に影響があるんじゃないかと心配です。
  • わわいです
    えー、あなたの上げたその説明書きには、区切り文字をnullに置き換え、と書いてありますが、その後置き換えたnullはそのままとか書いてありますか?w
    書かれていないことは、この世の中の誰も保証してくれません。
    #そもそもその説明書きは動作の説明であって実装の説明ではないです

    自分の思うようにならない!!といくら叫ばれても、よのなかはそういうものなのだよ、としかいいようがないとゆーかなんとゆーか。