こんにちは。
題名の通り文字列の指定範囲に該当する文字列を戻す関数を作ったのですが
実行すると強制終了されてしまいます。
(コンパイルエラーは出ませんでした)
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;
}
どのようにすれば、問題が解決するかご教授お願いします
先ほど投稿したソースに誤りがありましたので、訂正します。
>for( int i = spos; i<spos+byte; i++ ) {
> *bf = str[j++]; ※
※の部分は、 *bf = str[i] です。
他、当たります。
失礼しました。
>> 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;
}
http://www.mtakahashi.com/
10768 に移ったようです。
Gak さん、惜しい!
bf++ した後 return bf; しているので意味がなくなっています。
p=bf=malloc(byte+1);
...
return p;
にしましょう。
あと元文字列が不足している場合の対処が無いです。
# っていうかこの課題単純に strncpy で解決なのではないかと...
うぉ!!しまった。
類稀なるゴミスレ作成の速さに驚いて反射的にレスしてしまったので…
って理由になりませんな。tetrapodさん、訂正感謝です。
あと、VC超初心者へのLink張ってくれたRiSKさんにも感謝です。
ツイート | ![]() |