指定範囲の文字列を取得したい

解決


りさこ  2004-02-19 22:46:26  No: 53199

こんにちは。
題名の通り文字列の指定範囲に該当する文字列を戻す関数を作ったのですが
実行すると強制終了されてしまいます。
(コンパイルエラーは出ませんでした)

int main()
{
  //32byteの文字を格納
  char *wp_str = "11222 333344444555555 66666677777";

  printf("%s", GetString(wp_str, 0, 8);
  return 0;
}

//-----------
// 指定バイトの文字列取得
//
// Params: str      取得元文字列
//         spos     取得開始位置
//         byte     取得開始位置から取得するバイト数
// Return: 取得した文字列
//-----------
char * GetString(char *str, int spos, int byte)
{
  char *bf=0x00;
  int j = 0;

  for( int i = spos; i<spos+byte; i++ ) {
    *bf = str[j++];    ※←強制終了後、ここ示している
    bf++;
  }

  retrun bf;
}

どのようにすれば、問題が解決するかご教授お願いします


りさこ  2004-02-19 23:10:20  No: 53200

先ほど投稿したソースに誤りがありましたので、訂正します。

>for( int i = spos; i<spos+byte; i++ ) {
>    *bf = str[j++];    ※

※の部分は、 *bf = str[i] です。


りさこ  2004-02-20 00:25:52  No: 53201

他、当たります。
失礼しました。


Gak  2004-02-20 01:22:19  No: 53202

>>  char *bf=0x00;
>>      :
>>    *bf = str[j++];    ※←強制終了後、ここ示している
確保されていない領域にアクセスしようとしているためです。
メモリを確保しましょ。

  int main() {
    char *wp_str = "11222 333344444555555 66666677777";
    char* pstr = GetString(wp_str, 0, 8);
    if (pstr != NULL) {
        printf("%s", pstr);
        free(pstr);
    }
    return 0;
  }

  char * GetString(char *str, int spos, int byte) {
    char *bf=0x00;
    int j = 0;

    bf = malloc(byte + 1);
    if (bf == NULL)  return NULL;

    for( int i = spos; i<spos+byte; i++ ) {
      *bf = str[i];    ※←強制終了後、ここ示している
      bf++;
    }
    *bf  = NULL;
    retrun bf;
  }


RiSK  2004-02-20 01:44:03  No: 53203

http://www.mtakahashi.com/
10768 に移ったようです。


tetrapod  2004-02-20 02:30:33  No: 53204

Gak さん、惜しい!
bf++ した後 return bf; しているので意味がなくなっています。
p=bf=malloc(byte+1);
...
return p;
にしましょう。
あと元文字列が不足している場合の対処が無いです。

# っていうかこの課題単純に strncpy で解決なのではないかと...


Gak  2004-02-20 02:52:23  No: 53205

うぉ!!しまった。
類稀なるゴミスレ作成の速さに驚いて反射的にレスしてしまったので…
って理由になりませんな。tetrapodさん、訂正感謝です。

あと、VC超初心者へのLink張ってくれたRiSKさんにも感謝です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加