ファイルをEXEにドロップして起動させます。
ドロップしたファイルのパスを GetCommandLine( ) から
取り出すために、" の位置を調べます。
"EXEのパス" ドロップファイルのパス
となっているから、2番目の " の位置を調べました。
でも、for でのループが1回で終わってしまいます。
おかしいところを教えてください。


LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{

 char *p = GetCommandLine();
 char str[200];

 switch(msg){
 case WM_CREATE:
  int i;
  for(i = 1; p[i] == '"'; i++);{
   wsprintf(str, "%d", p[i]);
   MessageBox(hWnd, chStr, "", MB_OK);
  }

  wsprintf(chStr, "%d", i);
  MessageBox(hWnd, str, "", MB_OK); //結果は1

  wsprintf(chStr, "%#x", p[0]);
  MessageBox(hWnd, str, "1文字目", MB_OK); //結果は34

  wsprintf(chStr, "%#x", p[1]);
  MessageBox(hWnd, str, "2文字目", MB_OK); //結果は67

  wsprintf(chStr, "%#x", p[2]);
  MessageBox(hWnd, str, "3文字目", MB_OK); //結果は58

A 回答 (1件)

  int i;


  for(i = 1; p[i] == '"'; i++);{
このループは
  iをカウントアップしながらp[i]=='"'となるまで
となっています。即ち1回目のp[i]=='"'を見つけたらそこで
ループが終わるようになっています。

 次のようにしたらいかがでしょうか。
  int i,j;
  j=0;
  for(i = 1;j<2 ; i++);{
   if(p[i] == '"')j++;
    • good
    • 0
この回答へのお礼

i = 1 からカウントアップしているから
1回目の p[i]=='"' を見つけたら、そこでループが
終わっていいんだけど、素の他の部分で間違いに気づきました。
ありがとうございました。

お礼日時:2002/02/06 22:12

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

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

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

Qwsprintf( ポインタ , "%d" , "123" );

char str[100];
char *ptr;

wsprintf(str, "%d", "1234567");

wsprintf(ptr, "%d", "1234567");
について、
TextOut(hDC,0,10,str,lstrlen(str));
TextOut(hDC,0,30,ptr,lstrlen(ptr));
で出力したいんだけど、str ならできたけど、
ptr の方が文字化けしていました。

lstrlen(ptr); がいけないのかと思って、
その値を調べたら 0 でした。

strlen( ) はポインタに対応していると思いました。

#include <iostream.h>
main(){
char *p = "あいう";
cout << strlen(p);
}

で 6 だったから。
Win32 の lstrlen( ) はポインタに対応していないんですか?

Aベストアンサー

> new char[100];
この場合、char 型で、100個分確保して、そのポインタが返ります
new int[50] だったら int 型50個分
もちろん、型だけでなく、クラスも指定出来ます。
new string[50]

> 0065FE08, 0065FE0C, 0065FE10
> で、&ptr が 0065FE00 だったとすると、
> (ptr+2) = "aaa";
*(ptr+2) = "aaa"; の間違いですよね^^;

> としたら、sonota[] の値が変更されてしまうしいうことですね?
変更されますが、変更される値は"aaa"のポインタが、sonata[0]以降に格納されます。

書き換える先が、システムの領域だったら、「不正なアクセス」が起きて、プログラムが落ちます。Linuxだと「Segmentation fault」です。

後、配列とポインタは同じものと思っておいても通常差しつかえありません。array[a] は *(array + a) の様に解釈されます。そのため

int array[3] = { 1,2,3 };
printf("%d, %8x\n", array[0], &array[0]);
printf("%d, %8x\n", 0[array], &0[array]);
printf("%d, %8x\n", array[1], &array[1]);
printf("%d, %8x\n", 1[array], &1[array]);
printf("%d, %8x\n", array[2], &array[2]);
printf("%d, %8x\n", 2[array], &2[array]);

を実行してみてください。ただし、わかりにくくなるトリッキーな書き方なので、使わないのが普通です。

> new char[100];
この場合、char 型で、100個分確保して、そのポインタが返ります
new int[50] だったら int 型50個分
もちろん、型だけでなく、クラスも指定出来ます。
new string[50]

> 0065FE08, 0065FE0C, 0065FE10
> で、&ptr が 0065FE00 だったとすると、
> (ptr+2) = "aaa";
*(ptr+2) = "aaa"; の間違いですよね^^;

> としたら、sonota[] の値が変更されてしまうしいうことですね?
変更されますが、変更される値は"aaa"のポインタが、sonata[0]以降に格納されます。

書き換える先...続きを読む

Qp[-3][-4]にアクセス出来るようにしたい

ポインタのポインタをうまく使って、p[-3][-4]のようなアクセス(が有効に行われるように)したいのですが、うまくいきません。
ご教授願えないでしょうか。

以下のコードで p[-3][0] を a[0][0] を参照させる(?)ようにはできました。
後ろ側の添え字のマイナスシフトができないのです。
つまり p[-3][-4] が a[0][0] を参照させるようにするギミックが知りたいのです。よろしくお願いします。

-------------------------------------

int **a;

// 領域の動的確保 ( [12][18] )
a = new int*[12];
for(int i = 0; i < 12; i++)
a[i] = new int[18];


int **p;

p = &(a[3]) ;

for (int y=0; y<12;y++)
for (int x=0; x<18;x++)
a[y][x] = 1;

p[-3][0] = 99; //a[0][0]が99になる。


//領域の解放
for(int i = 0; i < 12; i++)
delete [] a[i];

delete [] a;

ポインタのポインタをうまく使って、p[-3][-4]のようなアクセス(が有効に行われるように)したいのですが、うまくいきません。
ご教授願えないでしょうか。

以下のコードで p[-3][0] を a[0][0] を参照させる(?)ようにはできました。
後ろ側の添え字のマイナスシフトができないのです。
つまり p[-3][-4] が a[0][0] を参照させるようにするギミックが知りたいのです。よろしくお願いします。

-------------------------------------

int **a;

// 領域の動的確保 ( [12][18] )
...続きを読む

Aベストアンサー

どうしてもp[-3][-4]がa[0][0]を参照するようにしたいのでなければ、次のようにしてはどうでしょう。

-------------------------
int **a;

// 領域の動的確保 ( [12][18] )
a = new int*[12];
for(int i = 0; i < 12; i++)
 a[i] = (new int[18]) + 4; // ← 変更点

int **p;

p = &(a[3]) ;

for (int y=0; y<12;y++)
 for (int x=0; x<18;x++)
  a[y][x] = 1;

p[-3][0] = 99; //a[0][0]が99になる。

//領域の解放
for(int i = 0; i < 12; i++)
 delete [] (a[i] - 4); // ← 変更点

delete [] a;
-------------------------

上のコードでは、p[-3][-4]がa[0][-4]を参照することになりますが、目的は満たせるのではないでしょうか。

どうしてもp[-3][-4]がa[0][0]を参照するようにしたいのでなければ、次のようにしてはどうでしょう。

-------------------------
int **a;

// 領域の動的確保 ( [12][18] )
a = new int*[12];
for(int i = 0; i < 12; i++)
 a[i] = (new int[18]) + 4; // ← 変更点

int **p;

p = &(a[3]) ;

for (int y=0; y<12;y++)
 for (int x=0; x<18;x++)
  a[y][x] = 1;

p[-3][0] = 99; //a[0][0]が99になる。

//領域の解放
for(int i = 0; i < 12; i++)
 delete [] (a[i] - 4); // ← 変更...続きを読む

Qchar gyou[1024];でcharの表現範囲は-128~127間でと!gyou[1024]の

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
  gyousuu=22 とでます。
 さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
 gyou[1024]の[1024]とは関係はありますでしょうか!?
  [1024]の意味は”要素数”と参考書に鉛筆書きがありました。
 charの表現範囲である1024は、はるかに超えているみたいですが?
  dharの表現範囲を1024が超えたとしても特に問題はなさそうです!
  このプログラムは動いていますのでは正常です。
  私の
  考え方としまして、何か誤りがありますでしょうか?
  よろしくお願いいたします。

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
...続きを読む

Aベストアンサー

> さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
> gyou[1024]の[1024]とは関係はありますでしょうか!?
ない。
1024 のほうはただ単に領域の個数を表しているだけで、読み込もうとするファイルの 1 行のバイト数がこれを超えない限り別に 1000 でも 3327 でも構わない(ある程度以上大きくなると別の問題が出てくるが)。
ただ単に 1024 = 2^10 でプログラマにはよく見る数字、かつ、普通のテキストなら 1 行が収まりそうな長さなだけ。

Qdc.TextOut(0 ,0 , *str) ;について

環境 WIN98 VC++6.0 MFC にて

パターンBはOKですが、パターンAだと不正な処理で落ちてしまいます。

どうしてなのかお教えください。

void CFffView::OnPaint()
{
CPaintDC dc(this);
//パターンA
CString* str ;
str = (CString*)("999");
dc.TextOut(0 ,0 , *str) ;

//パターンB
CString aaa ;
aaa = (CString)("999");
dc.TextOut(0 ,0 , aaa) ;
}

Aベストアンサー

両方ダメ。
Aのパターンで動くのは、たまたま。

CString aaa ;
aaa = "999";
dc.TextOut(0 ,0 , aaa) ;

これで十分。

あえてキャストするんだったら、
CString aaa ;
aaa = (LPCSTR)"999";
dc.TextOut(0 ,0 , aaa) ;


aaa=のところでは、ただの代入が行われているわけではありません。
オーバーロードされたオペレータが呼ばれています。


>str = (CString*)m_array.GetAt(i) ;

これは、m_arrayの要素にCString*を入れていて、初めて成り立つ式です。
値をいれているところと、m_arrayの宣言を確認してください。

str = (CString*)("999");
も、
aaa = (CString)("999");
も、リテラル文字列をつっこもうとしています。
リテラル文字列とCStringはまったく別物です。


人気Q&Aランキング

おすすめ情報