【初心者歓迎】C/C++室 Ver.44【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/11/03(土) 00:20:13ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.43【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1190860744/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0554546
2007/11/28(水) 12:51:48550で書いているソースがインクルードしていたものを
一応すべてインクルードしてみたんですが,だめでした….
>>553
コンパイルできなかったです.
0555デフォルトの名無しさん
2007/11/28(水) 12:58:35bcc5.5.1で>>546のソースコンパイルできたよ
ファイルが壊れてるかもしれんから、再インストールしてみ
0556デフォルトの名無しさん
2007/11/28(水) 12:58:37そりゃなんかおかしいね
bcc再インストールしてみた方がいいかもしんない
0557546
2007/11/28(水) 13:20:32お騒がせしました.みなさん本当にありがとうございました!
0558デフォルトの名無しさん
2007/11/28(水) 18:14:23仮想関数を含むオリジナルクラスを継承したクラスのインスタンスをnewしてそのポインタを
オリジナルクラスにキャストしてもう一度もとのクラスにキャストし直したもどした場合は
正常に動作するのですが、オリジナルクラスに仮想関数が含まれない場合はコンパイラエラーが出ます、
これは仮想関数を含むオリジナルクラスのインスタンスの場合だけそのクラスを継承したポインタにキャストできるということなのでしょうか?
この場合、オリジナルクラスのインスタンスには継承先の情報が無いと思うのですがどこから持ってきてるのでしょうか?
ついでにもうひとつお願いします
newでインスタンスを作成した場合deleteしなければ、プログラム終了まで有効なのでしょうか?
例えば関数の中でnewを行いクラスのポインタを変数に格納してそれを関数の引数として戻してnewを行った関数の外で使用しても
最後にdeleteさえすれば大丈夫なのでしょうか?
乱文失礼しましたが、よろしくお願いします。
0559デフォルトの名無しさん
2007/11/28(水) 18:29:41dynamic_castの話なら、そのとおり。仮想関数を持たないクラスには働かない。
継承先の情報はインスタンスが隠し持ってる仮想関数テーブルに入ってる。
そもそもそれがなきゃ仮想関数の呼び先を解決できない。
deleteしなければプログラム終了まで有効。その続きのも大丈夫。
deleteし忘れてどんどんnewしてるとそのうちメモリを食い尽くすから要注意。
0560デフォルトの名無しさん
2007/11/28(水) 18:54:52回答、ありがとうございます。
これでやっと先にすすめそうです。
0561デフォルトの名無しさん
2007/11/28(水) 18:59:420562デフォルトの名無しさん
2007/11/28(水) 19:04:580563デフォルトの名無しさん
2007/11/28(水) 19:37:45【○○にはお好きな(またはお嫌いな)単語をお入れください】
0564デフォルトの名無しさん
2007/11/28(水) 19:38:210565デフォルトの名無しさん
2007/11/28(水) 19:39:460566デフォルトの名無しさん
2007/11/28(水) 19:53:16関数内で仮想関数を含むオリジナルクラスを継承したクラスのインスタンスをnewでつくりそのポインタを
オリジナルクラスにキャストして関数の引数として返し、そのポインタをもう一度継承後のクラスにキャストした場合、
オリジナルクラスに存在しない継承後のクラスが持っているメンバ変数の値が維持されているのを確認できたのですが
この部分の値もずっと保持されるであってますか?
0567デフォルトの名無しさん
2007/11/28(水) 20:03:54+ 本物のプログラマは有給を使えない
0568デフォルトの名無しさん
2007/11/28(水) 20:11:30そういうネタはマ板の方がいいんじゃね
0569デフォルトの名無しさん
2007/11/28(水) 20:13:07合ってる
ポインタをいくらキャストしてもインスタンスの実際のクラスが変わったりはしない
0570デフォルトの名無しさん
2007/11/28(水) 20:31:14回答、ありがとうございます
0571デフォルトの名無しさん
2007/11/28(水) 20:36:460572デフォルトの名無しさん
2007/11/28(水) 21:05:56それはダウンキャストと言うのは知ってるね
dynamic_castは何をしようとするのかプログラマが知ってる限り
問題はない
0573デフォルトの名無しさん
2007/11/28(水) 21:24:520574デフォルトの名無しさん
2007/11/28(水) 23:00:01・C++にはキャストがいくつかありますが、それぞれの役割がよく分かりません。詳説願います。
・inline関数についてですが、同一ソース中でないとinline展開されえないですか?
・演算子オーバーロードにおいて左オペランドに自作関数をとる演算子等を定義する場合、
通常のメンバ関数のような形式で定義するのと通常のグローバル関数のような形式で定義するのにはどのような違いがありますか?
bool Foo::operator +(Foo rhs)とbool operator +(Foo lhs,Foo rhs)みたいなののことです
よろしくお願いします
0575デフォルトの名無しさん
2007/11/28(水) 23:09:03http://www.google.co.jp/search?q=C%2B%2B+%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88
0576デフォルトの名無しさん
2007/11/28(水) 23:31:54オブジェクト間最適化機能のあるコンパイラなら、別のコンパイル単位にある関数でも
インライン展開され得る。
0577デフォルトの名無しさん
2007/11/28(水) 23:41:11詳説せず、厳密さも気にせず簡単にまとめるとこんな感じ。
・const の付け外し→const_cast
・標準変換、およびその逆変換→static_cast
・安全な downcast や crosscast→dynamic_cast
・A→B→Aで戻る以外は実装依存→reinterpret_cast
■inline
同一ソースって何?
規格上は基本的に同一翻訳単位に inline 関数の定義がないと駄目だし(ただし定義前に呼び出しがあってもOKと書いてあった)、翻訳単位間で定義が一致する必要がある。
最適化としての inline 化なら最近は >576 らしい。Exceptional C++ Style にもそんなことが書いてあった。
■演算子オーバーロード
×自作関数
○自作クラス
だとして、メンバ関数にすると第 1 引数がその自作クラスの場合に限定される。
例えば、Foo() + 1 はどちらでも実現可能だけど、 1 + Foo() はメンバ関数で実現することができない。
0578デフォルトの名無しさん
2007/11/28(水) 23:46:00>左オペランドに
って明示してあった。
その場合は、operator+() が class Foo が定義されている namespace 内で定義されている限りはほとんど変わらないと思う。
もちろんメンバに対するアクセス制限は異なるけど。
0579デフォルトの名無しさん
2007/11/29(木) 01:07:40C言語(linux gcc)にて、テキストファイルの指定した一行を読み込んだ後に、
その行を削除する処理を行いたいのですが、何か手立てはありませんでしょうか?
無理言って申し訳ないのですが、別ファイルに指定行以外をコピーした後ファイルのリネームを行う、
もしくはメモリにファイル内容を確保し、指定行以外をファイルに上書きすると言う手法以外で
何か解決手段をご教授いただければと思います・・・。
よろしくお願いします。
0580デフォルトの名無しさん
2007/11/29(木) 01:09:48つまり、それをやればよい
0581デフォルトの名無しさん
2007/11/29(木) 01:54:000582デフォルトの名無しさん
2007/11/29(木) 02:16:170583デフォルトの名無しさん
2007/11/29(木) 07:37:02それでは時間がかかるので適当なバッファを用意してある程度まとめて読んでまとめて書く
て定石はさておいて
メモリに読み込まずにずらす方法を考えようか
アセンブラでレジスタだけ使ってどうにかならんかね
0584デフォルトの名無しさん
2007/11/29(木) 07:58:01サンクスサンクスサンクス
参考になりますた
0585デフォルトの名無しさん
2007/11/29(木) 08:11:39例えば、ブロック単位で読み書きするのではなく
1バイトごとにリスト構造にして持つとか。
0586デフォルトの名無しさん
2007/11/29(木) 08:18:510587デフォルトの名無しさん
2007/11/29(木) 12:32:010588デフォルトの名無しさん
2007/11/29(木) 20:35:17DLLを作成し、そのDLLの関数にCWnd型(MFCのやつです)のポインタを渡そうと思って、次のようなコードを書いてみましたが、
上手く渡りません。問題としてはCWnd::m_hWndの値が変わってしまうというものです。
以下にコードをあげます。
//DLL
void CTestClass::TestFunc(CWnd* pWnd)
{
TRACE(_T("TestFunc 0x%08x \n"), pWnd->m_hWnd);
}
//EXE
void CTestDialog::OnOK()
{
CTestClass test;
TRACE(_T("OnOK 0x%08x \n"), m_hWnd);
test.TestFunc(this);
}
このようにして、処理を行うと出力されるm_hWndの値が変わってしまいます。
理由をご存知の方がいらっしゃいましたら、教えてください。
よろしくお願いします。
0589デフォルトの名無しさん
2007/11/29(木) 20:50:590590デフォルトの名無しさん
2007/11/29(木) 20:54:35マージソートするにはどうすればいいのでしょうか?
普通のマージソートなら出来るのですが
双方向の場合どうすればいいのか解りません;;
0591デフォルトの名無しさん
2007/11/29(木) 21:31:42その後、ソートしたリストを順方向に辿りながら、逆向きのリンクを張りなおす
0592デフォルトの名無しさん
2007/11/29(木) 21:59:51おおー、その発送はありませんでした
無事できましたありがとう^^
0593デフォルトの名無しさん
2007/11/29(木) 22:31:14ZERO-WIDTH系の文字に置換しとけばよくね?
0594デフォルトの名無しさん
2007/11/29(木) 22:34:42回答ありがとうございます。ですが、それは違いました。
0595デフォルトの名無しさん
2007/11/29(木) 22:42:35EXE->スタティクリンクしたMFCで違う、みたいな話ではない?
0596デフォルトの名無しさん
2007/11/29(木) 23:07:08TRACE(_T("OnOK 0x%08x 0x%08x \n"), this->m_hWnd, &(this->m_hWnd));
とりあえずDLL,EXE両方が同じアドレスを参照出来ているかを確かめてみようか。
0597デフォルトの名無しさん
2007/11/30(金) 00:26:19あるISequentialStreamのオブジェクトstreamにデータが入っていて、Readメソッドで
vector< char > buf;
buf.reserve( MAX );
for ( 読み終わるまでループ ) {
buf.resize( buf.size() + size );
stream.Read( &buf[ 0 ], size, read );
}
のように、size単位でデータをバッファに格納しようとしています。
データのサイズは1KB〜130MBほど、MAXは余裕をもって150MB、sizeは1MBです。
このstreamはあるライブラリ(Soap Toolkit 3.0)で提供されているもので、内部の実装は
どうなってるかわかりません。
上記でデータ自体は取ってこれるんですが、非常に時間がかかってしまいます。
3GHz、2GメモリのPCで3分とか…。
メモリに格納するだけでこんなに時間がかかる訳ないと思うんですが、Readのやり方が
間違っているのでしょうか?
sizeが1MBなのは、小さいサイズのデータの方がほとんどで100MBクラスはまれである
ということと、
buf.resize( MAX );
stream.Read( &buf[ 0 ], MAX - 1, read );
のように、一回で全部読み込もうとしたときに、Readの返値のHRESULTが不明なエラーを
示す値を返し、readが0になるという現象が起きるのが理由です。
この原因もわかってないです。
ISequentialStreamとかは使ったことないので、どう使うのが正しいのかよく分からない状況です。
教えていただけると助かります。よろしくお願いします。
0598デフォルトの名無しさん
2007/11/30(金) 02:42:18そんなものだよ。正常。
0599デフォルトの名無しさん
2007/11/30(金) 03:15:230600デフォルトの名無しさん
2007/11/30(金) 14:58:28sizeof(CWnd)を出力してみて、違う値が出てきたので、色々確認した結果、
>>595さんの言う通りの話でした。
ありがとうございます。
0601デフォルトの名無しさん
2007/11/30(金) 20:29:340 #include<stdio.h>
1 void quicksort(int x[],int n){
2 int m;
3 int *pa=x+2. *pz=x+n
4 if(n==2){
5 if(x[1]>x[2])m=x[1],x[1]x[2],x[2]=m;
6 return;
7 }
8 while(pa<pz){
9 while(pa<=x+n && *pa<x[1])pa++;
10 while(pz>=x+2 && *pz>=x[1])pz--;
11 if(pa<pz)m=*pa, *pa++=*pz, *pz--=m;
12 }
13 if(pa>x+2)m=x[1],x[1]=*(--pa),:pa=m;
14 if(pa-x>2)quicksort(x,pa-1-x);
15 if(x+n-pz>1)quicksort(pz.x+n-pz);
16 }
これの8〜12行目の部分は、9行目で前から数列の6,4,7,12まで進み、
10行目で後ろから2まで進み、12と2を交換するという意味であってますか?
0602デフォルトの名無しさん
2007/11/30(金) 21:44:310603デフォルトの名無しさん
2007/11/30(金) 22:06:450604デフォルトの名無しさん
2007/11/30(金) 23:54:11コンパイラーあれば、教えて頂けないでしょうか?
ちなみにVisual C++ 2005 Express Edition持ってます、使えますでしょうか?
0605デフォルトの名無しさん
2007/11/30(金) 23:57:530606デフォルトの名無しさん
2007/11/30(金) 23:58:460607デフォルトの名無しさん
2007/12/01(土) 00:03:29とりあえずコピペで、ちゃんとコンパイルできるか見てみましたが、
エラーなにがおかしいですか?
// test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i;
for(i = 0; i < 10; i++)
printf("i = %d\n", i);
printf("end.\n");
return 0;
}
0608デフォルトの名無しさん
2007/12/01(土) 00:05:090609デフォルトの名無しさん
2007/12/01(土) 00:14:15Visual C++ 2005 Express Editionのプロジェクトを開けて、コード記入する欄が
できたので、上のように試しにコードを貼り付けして デバッグというボタン押したら、
エラーになりました。コードのどこがおかしいのでしょうか
0610デフォルトの名無しさん
2007/12/01(土) 00:24:47stdio.hをincludeしてないからだと思うけど
0611デフォルトの名無しさん
2007/12/01(土) 00:34:17#include"stdio.h"と入力すればよろしいでしょうか
0612デフォルトの名無しさん
2007/12/01(土) 00:35:510613デフォルトの名無しさん
2007/12/01(土) 00:44:13死んでほしいな、こういうヤツ。
0614デフォルトの名無しさん
2007/12/01(土) 03:28:40グローバル変数にして使いたいのですが
0615デフォルトの名無しさん
2007/12/01(土) 03:29:52void (int x, int *pt)
{
int i;
i = 0; *pt = 1;
while (i < x) {
++i; *pr = *pt * i;
}
printf("factorial called, %3d!=%12ld\n", x, *pt);
}
最初の定義をこんな風につくったんですがダメなとこを指摘してください。
0616614
2007/12/01(土) 03:31:050617デフォルトの名無しさん
2007/12/01(土) 03:35:54>void (int x, int *pt)
関数の名前がない
>>616
関数の外でグローバル変数を定義すればいいじゃん
何か問題があるのか?
0618614
2007/12/01(土) 03:37:00わかりました 外に定義します
0619デフォルトの名無しさん
2007/12/01(土) 03:42:11そもそもグローバル変数が何かをわかってないだろ。
0620615
2007/12/01(土) 03:43:09void factorial(int x, int *pt);
こうですか
0621デフォルトの名無しさん
2007/12/01(土) 03:57:01Cの標準ライブラリの関数を使おうとしたら色々とエラーが出てきました。
で、MSDNを読んでみたら、
1. 標準関数の strlen とかは危険だから _strnlen_l みたいなVCの独自関数を使え。
2. WinAPI は char の時代は終わったから TCHAR や _tcs 系の関数を使え。
ってことが書いてありました。
警告を減らせば char 型やCの標準関数も使えるみたいですが、
このままVC独自色に染まってしまった方が良いのでしょうか?
0622デフォルトの名無しさん
2007/12/01(土) 04:10:05for (counter=i ;counter<=i+9;counter++) {・・・
for文が苦手です。この一文はどういうふうに解釈してよいか
わかりません。解説して頂けないでしょうか
0623デフォルトの名無しさん
2007/12/01(土) 04:16:41{
文
}
は
式1
while( 式2 )
{
文
式3
}
と殆ど同じ。
こうすればわかるか?
counter=i;
while( counter <= i+9 )
{
/* 何か */
counter++;
}
0624デフォルトの名無しさん
2007/12/01(土) 04:19:070625デフォルトの名無しさん
2007/12/01(土) 04:25:29なるべく標準的にしたいなら標準で
速度を優先したいならWindows APIなどで
0626デフォルトの名無しさん
2007/12/01(土) 05:17:00なぜstrlenが危険といわれるのか?scanfやprintf、strcpyなどもそう
なぜcharを使用しなくなったのか?
それをちゃんと知っておいたほうがいい。
VC色に染まってもいいが、VC以外で開発するときに代替案がすぐに
浮かぶようであれば問題ないと思う。
標準準拠を目標にして自作するのもいいし、危険とされる関数を
ラッピングして安全なものを作るのでもいい(←この時はpragmaで警告抑制)
0627デフォルトの名無しさん
2007/12/01(土) 06:55:28標準関数は関数の方でバッファサイズをチェックしてなかったり文字列が '\0' で終了していないと止まらなかったりで危険。
VC 版は必ずバッファサイズと最大長を指定させていて、文字列が長すぎたりする時は途中で打ち切ってくれるので安全。
ってことですよね。
char は...Win9x は内部的に char 型だったけど最近のXPとかは内部的に UNICODE だから?
一緒に買ってきた教科書には当然のごとく _strnlen_l とか何にも載っていないんですが、
VC流で勉強しても教科書探しとか他の人との情報交換とかの妨げにならないか心配です。
0628デフォルトの名無しさん
2007/12/01(土) 07:27:170629デフォルトの名無しさん
2007/12/01(土) 07:39:53const char *eos = str;
while( *eos++ ) ;
return( eos - str - 1 );
}
koeeeee!!!
0630デフォルトの名無しさん
2007/12/01(土) 07:41:22size_t n;
for (n = 0; n < maxsize && *str; n++, str++);
return n;
}
よs
0631デフォルトの名無しさん
2007/12/01(土) 07:43:47打ち切って欲しい長さはやりたいことやプログラムの仕様によって決まるはず。
例えば文字列が100文字未満か100文字以上かで分岐させたいとき、
strlen だと'\0'が見つかるまで暴走を続けるが
strnlen_lなら「とりあえず100文字目までに'\0'はなかった」と帰ってきてくれる。
それ以外の場合でも「これ以上長いのは怪しいから扱いません」って断れるはず。
0632デフォルトの名無しさん
2007/12/01(土) 07:44:500633デフォルトの名無しさん
2007/12/01(土) 07:58:090634デフォルトの名無しさん
2007/12/01(土) 08:01:06しかもその為のコストは極僅かときたもんだ
少なくともその部分でのオーバーフローの可能性は無くなる
まぁ大抵の人はこんなもの出る前から自作のセーフなライブラリ作って使ってたけどね
0635デフォルトの名無しさん
2007/12/01(土) 08:11:350636デフォルトの名無しさん
2007/12/01(土) 08:24:28123456.jpg
123.jpg
このようファイル名の、数字のところだけを抜き出したいんです。
数字のところの長さは変わります。
そこでとりあえず、
char argnum[10];
hogeStrcpy(argv[1], argnum);
void hogeStrcpy(char *origin, char *number){
int i;
for(i = 0; origin[i] != '¥x2e'; i++){
number[i] = origin[i];
}
}
みたいなださださな物を書いてみたのですが、
引数の数字が短かかった場合、表示するとargnumにゴミが残ってしまいます。
なんとか数字だけをコピーしたいのですが、何か良い方法はないでしょうか?
0637デフォルトの名無しさん
2007/12/01(土) 08:28:060638デフォルトの名無しさん
2007/12/01(土) 08:35:55atoi("123456.jpg")とかじゃなくて?
そうでないならsscanf("123456.jpg", "%[^.]", buf)って話かな。
0639デフォルトの名無しさん
2007/12/01(土) 08:52:40strnlen_lが十分に安全じゃなかったとしても、strlenはそれ以上に危険なんだから。
0640デフォルトの名無しさん
2007/12/01(土) 09:02:09atoi完全に存在を忘れてました。
ありがとうございます。
0641デフォルトの名無しさん
2007/12/01(土) 09:05:29>引数の数字が短かかった場合、表示するとargnumにゴミが残ってしまいます。
文字列の長さがargnumの配列サイズ以下、ってことか?
argnumを初期化するか、hogeStrcpyの最後で'\0'を入れればいい。
0642636
2007/12/01(土) 09:34:44>>641
すいません。atoiでは駄目みたいです。
やりたいことは、
絶対パス
/usr/boku/graphic/123456.jpg
/usr/boku/graphic/1234.jpg
で渡される引数を、
/usr/boku/graphic/123456
/usr/boku/graphic/1234
で切り出して、
/usr/boku/graphic/123456hoge.jpg
/usr/boku/graphic/1234meso.jpg
みたいな感じで書き出したいんです。
/usr/boku/graphic/123456
/usr/boku/graphic/1234
の長さが変わるので、
配列argnum以下の長さだった場合、
argnumにゴミが残ってしまうんです。
で、別に文字列として表示する訳ではないので、
argnumを0で初期化したり、最後に'¥0'を入れたとしても、
/usr/boku/graphic/12345600hoge.jpgや
/usr/boku/graphic/12340000meso.jpg
みたいになるんじゃないかなと。
何か良い方法はないでしょうか?
0643デフォルトの名無しさん
2007/12/01(土) 09:39:25"0"と'\0'は違う。
ヌルターミネートでぐぐれ
0644デフォルトの名無しさん
2007/12/01(土) 09:58:37Borland 用のGRWINをインストールしました。
#include <stdio.h>
#include "GrWin.h"
int main(){
GWinit();
GWopen(0);
GWindow(-1,-1,1,1);
GWline(-1,-1,1,1);
}
のプログラムのコンパイルが通りません。
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_GWinit' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWopen' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWindow' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWline' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
** error 1 ** deleting Debug\grwin.exe
インストールがちゃんとできてないんでしょうか??
0645デフォルトの名無しさん
2007/12/01(土) 10:04:51libはちゃんとリンクしてんの?
0646デフォルトの名無しさん
2007/12/01(土) 10:09:18それはなんですか?Includeフォルダには grwin.hがインストールされてますが・・・・
0647636
2007/12/01(土) 10:14:28アルェー。
ビックリ。
出来てしまいました。
ヌルターミネートって何なんですか?
調べた限り、¥0との違いが良くわかんなかったです。
配列に文字列を代入した場合、0が続くと文字の終端になる?
1230000000005みたいな物だった場合もうまくいくのは何故ですか?
0648デフォルトの名無しさん
2007/12/01(土) 10:16:07自分の環境くらい晒してくれ
grwinは使ったことないが、
http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=753
とか見る限りヘッダには宣言しかされてなくて、libファイルをリンクしないと駄目なんだろ、たぶん
0649デフォルトの名無しさん
2007/12/01(土) 10:22:30リンク先みたらわかりました!助かりました。
ありがとうございました
0650デフォルトの名無しさん
2007/12/01(土) 12:22:39int i;
で定義したchar型のデータに変数を代入したいんですが、どうすればいいですか?
pt = "ほげほげ";
はできるんですが、
ほげほげ i みたいに変数の値も代入するやりかたがわからないです
0651デフォルトの名無しさん
2007/12/01(土) 12:23:10は
ch = "ほげほげ";
でした
0652デフォルトの名無しさん
2007/12/01(土) 12:23:25'0'は、0の文字コードをあらわします。(値としては0x30)
'\0'は、値として0をあらわします
文字列と言うのは、char型の配列であるので、
たとえば、"1230005"と言う文字列は、
31,32,33,30,30,30,35,0
と言う風に入っていると考えれば大体問題ないかと
ちなみに、 ""で括るのと、''で括るのでも意味が違うので、注意してください。
0653デフォルトの名無しさん
2007/12/01(土) 12:35:08>char *ch;
これは、char型のポインタです。char変数のアドレスもしくは、
配列の先頭アドレスを入れるものです。
>ch = "ほげほげ";
これは、わかりやすく言うと、実行プログラム中に、
"ほげほげ"という文字列が確保されていて、
そこの先頭アドレスをchに代入しているだけのことです。
>ほげほげ i みたいに変数の値も代入するやりかたがわからないです
いまいちやりたいことがわからないのですが、
変数の値を文字列にして、ほげほげのあとに追加するのなら、
charの配列をある程度確保しておいて、そこに、ほげほげをコピーして、
その後ろに文字列に変換した数字をコピーすればいい。
なんにせよ、ポインタをきちんと理解しておいたほうがいいですよ。
■ このスレッドは過去ログ倉庫に格納されています