プログラムの作成をしたのですが、
自宅(VisualC++)だと実行できるのに、
学校の端末(OSしかわかりませんが、UNIXです。)
だと、core dumpedしてしまいます。
どういう原因が考えられるでしょうか?
プログラムソースは次の通りです。
――――――――――――――――――――――――――
#include<stdio.h>
#include<stdlib.h>

char *strtok(char *moji, char cc);

void main()
{
char moji[200];
char kugiri[10];
char *cp;

printf("文字列を入力してください\n");
scanf("%s",moji);
printf("区切り文字を入力してください\n");
scanf("%s",kugiri);

cp=strtok(moji,kugiri[0]);
printf("取り出した文字列は%s\n",cp);

while(cp!=NULL){
cp=strtok(NULL,kugiri[0]);
printf("取り出した文字列は%s\n",cp);
}
}

char *strtok(char *moji,char cc)
{
int len;
char *cp1,*cp2;
char *mem;
static char *moji_old;

if(moji==NULL){
moji=moji_old;
}
     len=0;
cp1=moji;
while(*cp1!='\0'){
len++;
cp1++;
}

mem=malloc(len+3);
if(mem==NULL){
puts("メモリが足りません\n");
return NULL;
}

cp1=moji;
cp2=mem;
while(*cp1!=cc && *cp1!='\0'){
*cp2=*cp1;
cp1++;
cp2++;
}
free(mem);

if(*cp1=='\0'){
moji_old=cp1;
mem=NULL;
}
else{
moji_old=cp1+1;
*cp2='\0';
}
return mem;
}
――――――――――――――――――――――――――
以上です。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

落ちているところは、


while(cp!=NULL){
cp=strtok(NULL,kugiri[0]);
printf("取り出した文字列は%s\n",cp);←ここです。
}
strtok()関数がバグっています。
入力した文字列の最後に;がないので、

if(*cp1=='\0'){
moji_old=cp1;
mem=NULL;
}
最後の'lmn'がこの判定に入ってしまい、NULLをリターンします。
このNULLをprintfで表示しようとするので、coredumpとなります。
回避は、この分岐内でも、'mem=NULL;'ではなく'*cp2='\0';'としましょう。
他の方が指摘しているfreeした後にメモリを利用しても、ポインタは消えないので事実上問題はありません。
プログラムとしてはよろしくありませんが...
    • good
    • 0
この回答へのお礼

ありがとうございます。
よくわかりました。

お礼日時:2001/01/24 16:05

#include <stdio.h>


#include <stdlib.h>

main()
{
static char *aa;

aa = malloc(5);
strcpy(aa, "abc");

free(aa);

printf("%s\n", aa);

sleep(2);
strcat(aa, "de");
printf("%s\n", aa);

sleep(2);
aa = NULL;
printf("%s\n", aa);
}
と書くと、abcと表示し、2秒後にabcdeと表示し、2秒後にcoredumpしますよ。
因みにgdbの内容
(gdb) where
#0 0xef723d50 in strlen ()
#1 0xef761f8c in _doprnt ()
#2 0xef76ad60 in printf ()
#3 0x10a00 in main () at b.c:21
(gdb) list 21
16 strcat(aa, "de");
17 printf("%s\n", aa);
18
19 sleep(2);
20 aa = NULL;
21 printf("%s\n", aa);
22 }
solarisで純正コンパイラ。
linux gcc では、coredumpせずに(nul)と表示してくれますね。
    • good
    • 0

う~ん、、、


core dumpの理由は、strtok()内で
mem=malloc();した後、cp2=mem;と代入してますね。
その後、free(mem);を実行しておきながら、
*cp2='\0';をやってますね。
このとき*cp2(mem)がallocateしていたメモリ
開放されています。
だから、Segmentation Faultなのです。
つまり、「アクセスしてはいけない領域に
アクセスしようとした」のです。

*cp2='\0';とやっても、free(mem);をする以上、
Segmentation Faultです。
よって、ある意味、mem=NULLは正しいともいえます。

また、printf("%s", NULL);ではエラーは発生しませんよ!
全く問題なく正常に動作します。

VCで動くのはWindowsとVCのメモリ管理が
杜撰すぎるだけです。
    • good
    • 0

ここでmemfreeしちゃだめです。


その後で*cp2='\0';をしてるので、ここで
SegmentationFaultが発生します。
また、return mem;をする場合は、呼び出し先で
メモリ開放しちゃだめです。
また、moji_oldもできるだけstrtok内でalloc/free
し、アドレスの代入ではなくメモリーコピーしましょう。
    • good
    • 0

えーっと free(mem) したあとに return mem してるんですが、それはOKですか?

    • good
    • 0

今Linux上でコンパイルして実行してみたのですが特に


core dump しません...

core dumpする時に入力データとして何をわたしていますか?

あと、学校の端末で

gcc -g -o strtest strtest.c
gdb strtest

等としてソースコードレベルでデバッグするとわかるかと思います。
OSは、uname -a とかするとわかると思います。

この回答への補足

実行時に表示されるのは次の通りです。
nagatsuki% report2
文字列を入力してください
bcde;efgh;;ijk;;lmn
区切り文字を入力してください
;
取り出した文字列はbcde
取り出した文字列はefgh
取り出した文字列は
取り出した文字列はijk
取り出した文字列は
Segmentation fault (core dumped)

以上です。

補足日時:2001/01/23 01:40
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QUSBハブ経由で幾つかの端末を充電しようとしてるのですが、充電できてる端末と充電できてない端末がある

USBハブ経由で幾つかの端末を充電しようとしてるのですが、充電できてる端末と充電できてない端末があるのですがなぜでしょう?
なお、それぞれの端子にON OFFのスイッチがありますが全部ONです

以上、お手数をおかけして大変恐縮ではございますが、ご対応のほど、よろしくお願い申し上げます。

Aベストアンサー

Ankerのような優良メーカーのこのような製品を使えば問題は解決しますよ。

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

Qモバイル端末用充電器にPSPのコネクタをつけたい

来月発売されるモンスターハンターのモバイル端末用充電器を買う予定なのですが
商品にはPSPとDSiの充電用のコネクタが付属されていません。

そこで、他にPSPとDSiの充電用のコネクタがないか探してみたのですが
このコネクタは、この充電器に使用できるでしょうか。

宜しくお願い致します。

【モバイル端末用充電器】
http://www.amazon.co.jp/gp/product/B004GEBXES/ref=s9_simh_gw_p23_d0_i1?pf_rd_m=AN1VRQENFRJN5&pf_rd_s=center-1&pf_rd_r=17GDBS409ETXTYW2GWZ6&pf_rd_t=101&pf_rd_p=463376736&pf_rd_i=489986

【コネクタ】
http://item.rakuten.co.jp/watch-me/wm-118/

Aベストアンサー

 そのバッテリーのオリジナルモデルを作っている会社にはオプション設定がありました。
http://www.energizerpowerpacks.com/jp/
http://tipfinder.xpalpower.com/02tip.php?rp=&cno=&did=11&device=Portable%20Gaming&bid=87&brand=Nintendo&mid=5878&model=DSi
http://tipfinder.xpalpower.com/02tip.php?rp=&cno=&did=11&device=Portable%20Gaming&bid=5&brand=SONY&mid=1411&model=Sony%20PSP

 日本での発売元のサイトはこちら。

http://www.wc-a.co.jp/

 11月16日発表のハローキティとワンピースのモデルにはPSP用、DSi/LL用のアダプタと明記しての同梱もありますね。12月1日発表のラブプラスモデルでは対応表には載っていないものの商品説明と画像にPSP用アダプタが見られます。それがなぜか12月9日発表のMHP3rdモデルではアダプタごと削除。
http://www.wc-a.co.jp/imgdir/news/101116.pdf
http://www.wc-a.co.jp/imgdir/news/101201.pdf
http://www.wc-a.co.jp/imgdir/news/101209.pdf

 MHP3rdモデルが欲しくて確実にPSPとDSiに接続したいなら、別のモデルも買ってコネクタ流用。時間かかってもいいならオリジナルの発売元に製品登録すればオプションを手に入れられるかも。

http://www.energizerpowerpacks.com/jp/services/free-tips-for-life.php

 ご質問のLINK先コネクタが使えるかはどちらも仕様がわからないのでなんとも。

 そのバッテリーのオリジナルモデルを作っている会社にはオプション設定がありました。
http://www.energizerpowerpacks.com/jp/
http://tipfinder.xpalpower.com/02tip.php?rp=&cno=&did=11&device=Portable%20Gaming&bid=87&brand=Nintendo&mid=5878&model=DSi
http://tipfinder.xpalpower.com/02tip.php?rp=&cno=&did=11&device=Portable%20Gaming&bid=5&brand=SONY&mid=1411&model=Sony%20PSP

 日本での発売元のサイトはこちら。

http://www.wc-a.co.jp/

 11月16日発表のハローキティとワンピースのモデ...続きを読む

Qerror C2143: 構文エラー : ';' が '{' の前にありません。

#include <stdio.h>
int main(void)
{
  int in;
  printf("20以上の数字を入力してください\n");
  scanf("%d", &in);

  if(in >= 20){
    printf("20以上の数字です。\n");
    printf("終了します\n\n");}

  else if(in <= 5){
    printf("5以下の数字が入力されました\n");
    printf("20には程遠いです\n\n");}

  else(in <= 19){
    printf("20以上の数字ではありません\n");
    printf("20以上の数字を入力してください\n\n");}
  return 0;
}

C言語でVisual C++ Expressを使っています
このコードでビルドすると
(16) : error C2143: 構文エラー : ';' が '{' の前にありません。
と表示されてしまいます。何がいけないのでしょうか?

#include <stdio.h>
int main(void)
{
  int in;
  printf("20以上の数字を入力してください\n");
  scanf("%d", &in);

  if(in >= 20){
    printf("20以上の数字です。\n");
    printf("終了します\n\n");}

  else if(in <= 5){
    printf("5以下の数字が入力されました\n");
    printf("20には程遠いです\n\n");}

  else(in <= 19){
    printf("20以上の数字ではありません\n");
    printf("20以上の数字を入力してください\n\n");}
  return...続きを読む

Aベストアンサー

  else(in <= 19){
の部分ですが、
  else if (in <= 19){
のつもりだったのでしょうか。
この場合、
  else{
だけでよいです。

QUSB充電できない端末の外での充電

7インチのガラパゴス(A01SH)を購入しようと検討しているのですが

調べていくと、この機種はUSB充電ができないようなんです。
充電するには、家のコンセントに電源コードをさしこんで充電するようなのですが

外で、バッテリーがなくなりそうになったときに、ガラパゴスに充電できるような商品はないでしょうか。
USB充電ができれば、mobile boosterとか、いろいろ選択肢があるようですが

ネットで検索してみましたが、こんなの外に持ち歩けないよというような、どでかいものとかしか
ひっかかりませんでした。

この手のUSB充電ができない端末は、外での充電はあきらめたほうがよいのでしょうか。
何かこういう商品があるよとかありましたら教えていただけるとうれしいです。

宜しくお願いいたします。

Aベストアンサー

下記URLで上手く充電できているようです。
http://mongonta.blog24.fc2.com/blog-entry-123.html

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

Q海外で「家庭用ACコンセント/USBアダプタ」+「USBからWIN端末を充電するケーブル」での充電

どこに質問してよいかわからずこちらのカテゴリーにさせていただきます。

今Gloovyという会社の”家庭用ACコンセント/USBアダプタ”型番GM-PW001Aという商品を使ってUSBタイプのMP3プレーヤーを充電しています。
これは対応電圧100~240Vとパッケージには書いてありますが、実際はInput100~110Vとなっています。
では240Vが可ってどういうこと?と疑問になるわけです。

今度9月に中国に行くことが決まりましたが、そのときに「USBからWIN端末を充電するケーブル」を購入し、上記の製品を使ってを充電させたいです。
中国の電圧は220Vの為、パッケージ上は○、しかしもしダメであれば、携帯がご臨終になる可能性があるので、それは避けたいです。

上記の製品について、また「USBからWIN端末を充電するケーブル」について、ご意見のある方がいれば教えてください。
変圧器を持ち込むより軽くなる為、問題なければこれでいきたいと考えています。

Aベストアンサー

仕事でしょうか?旅行でしょうか?

仕事で使うホテルのクラスですと、トイレに
100Vと220Vの2電源のところが多かったと
思います。

自分は、トイレで充電してました。

あらかじめホテルが分かっているのであれば、
確認してみては?

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

Q温度の高い充電式USBカイロ

温度の高い充電式のUSBカイロを探しています。

以前最高温度が45℃のを買ったのですが、冷たい手で握った瞬間に
カイロ本体が冷たくなってしまい、30秒ほど温まるまでに時間がかかり
それを何度も繰り返しているため、ずっと手で握っていると
冷たいものを触っているような感じになります。(発熱面積が狭いから?)
全然カイロとして機能していません。

普通のカイロと同じように使えるようなUSBのものを探しています。
温度が高いあるいは発熱量が大きいものでオススメはありますか?

Aベストアンサー

純粋に発熱量を求めるのなら昔ながらの白金懐炉を使うとか
直ぐに冷たくなるのを少し回避できるだけでも良いのなら布袋などで包む
でも良いと思いますよ。


発熱量で言えば、
昔ながらの白金懐炉はMAX13W程度
使い捨てカイロなどは小さなもので1W程度から

対してUSBでは供給することが許されるエネルギー量は2.5Wという決まりがあります。
したがって、この決まりを守る限り発熱量は2.5W未満にならざるを得ませんし
この決まりを守らないものはUSB機器として売る事ができません。

充電式で2.5Wを10時間ほど掛けて溜め込み1~2時間で使い切るというような
設計にする方法もありますが、小型のノートパソコン用バッテリー並みの容量が必要で
相応のサイズと重量にもなってしまう上に充電に掛かる時間が長い割りに使える時間が
短いためにあまり実用的ではありません

したがって、純粋に発熱量を求めるのなら昔ながらの白金懐炉を使うほうが実用的です。

もしくは考え方を変えて、例えば使い捨てカイロなどは熱量は小さいものの
熱が一気に逃げ難い作りになっていて、直ぐに温度が下がる事を避けています。
同じように保温を工夫するでも良いと思いますよ

純粋に発熱量を求めるのなら昔ながらの白金懐炉を使うとか
直ぐに冷たくなるのを少し回避できるだけでも良いのなら布袋などで包む
でも良いと思いますよ。


発熱量で言えば、
昔ながらの白金懐炉はMAX13W程度
使い捨てカイロなどは小さなもので1W程度から

対してUSBでは供給することが許されるエネルギー量は2.5Wという決まりがあります。
したがって、この決まりを守る限り発熱量は2.5W未満にならざるを得ませんし
この決まりを守らないものはUSB機器として売る事ができません。

充電式で2.5Wを10時間ほど掛け...続きを読む

Qchar *(*)[3];について

#include <iostream.h>
main(){
char *(*pp)[3];
printf("%lu", sizeof(char*));
printf(" pp%lu", pp);
printf(", ++pp%lu", ++pp);
}

これを実行して
4 pp6660000, ++pp???????
のように表示されたときに、???????の部分が何になるか考えました。
ppはchar[3]を指すポインタのポインタだから、ppをインクリメントすれば、「char[3]を指すポインタ」の大きさだけ大きくなるはずだから、「char[3]を指すポインタ」の大きさである4バイト大きくなるはずだから
4 pp6660000, ++pp6660004
になると思いました。
どこを勘違いしていてどう考え直せばよいか教えて下さい。

Aベストアンサー

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//ppc3 は、char[3]を指すポインタのポインタ
ppc3=&pc3;
printf("%p\n",ppc3);
ppc3++;
printf("%p\n",ppc3);//+4(ポインタサイズ分)される

return 0;
}

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//p...続きを読む


人気Q&Aランキング

おすすめ情報