• ベストアンサー

ウインドウ終了の取得ができません

以下にソースを #include <windows.h> #include <stdio.h> static int array[300] = {0}; static int temp[300] = {0}; static int count = 0; static int i = 0; BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lp) { static bool is_first = true; DWORD style = ::GetWindowLong(hwnd, GWL_STYLE); if ( ::IsWindow(hwnd) && ::IsWindowVisible(hwnd) && (style&WS_CAPTION) && !(style&WS_POPUP) ) { char buf[65536]; ::GetWindowText(hwnd, buf, 65535); if ( buf[0] != '\0' ){ if ( is_first ){ is_first = false; } else{ // 配列arrayにハンドルを代入 array[i] = int(hwnd) ; //printf("%d\n",i); i++; // 配列arrayに格納されたハンドル数 count++; } } } return TRUE; } int main(int argc, char** argv) { int a; int j = 0; int k = 0; int t_handend = 0; int flg = 0; char buf[65536]; // 無限ループ while(1){ // 起動しているアプリケーションのハンドル取得(配列arrayに格納) ::EnumWindows(EnumWindowProc, 0); i = 0; // temp内のハンドル数の計算 while(temp[t_handend] != 0){ t_handend++; } for(a=0;a<count;a++){ ::GetWindowText((HWND)array[a], buf, 65535); printf("array[%d]=%d=%s\n",a,array[a],buf); } for(a=0;a<t_handend;a++){ ::GetWindowText((HWND)temp[a], buf, 65535); printf("temp[%d]=%d=%s\n",a,temp[a],buf); } //printf("flg;%d\n",flg); for(k = 0; k < count; k++){ for(j = 0; j < t_handend; j++){ if(array[k] == temp[j]){ flg = 1; break; } } //printf("flg;%d\n",flg); if(flg != 1){ //printf("%d\n", array[i]); //プロセス名取得 ::GetWindowText((HWND)array[k], buf, 65535); printf("%sが起動しました\n", buf); //flg1=1; } flg = 0; } for(k = 0; k < t_handend ; k++){ for(j = 0; j < count; j++){ if(temp[k] == array[j]){ flg = 1; break; } } if(flg != 1){ ::GetWindowText((HWND)temp[k], buf, 65535); if((HWND)temp[k]!=0){ printf("%sが終了しました\n", buf); } //printf("%d\n", temp[i]); } flg = 0; } // tempの更新 for(j = 0; j < count; j++){ temp[j] = array[j]; } for(; j < 300; j++){ temp[j] = 0; } flg = 0; count = 0; puts(""); Sleep(3000); } return 0; } これでウインドが立ち上がったときと終了のログをとろうとしましたが、このままですと終了したウインドの名前がとれません。 どうしたらよいでしょうか。?

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス ・プログラムの起動と終了の監視について。  (1)ウインドウハンドルとそのキャプションを持つ構造体を用意。  (2)前回列挙した情報と今回列挙する情報を配列などに保存。  (3)1回の列挙で取得したウインドウハンドルを元にソート。  (4)前回、今回の列挙の差分から『起動』『終了』を判定。  (5)今回の列挙データを前回の列挙データとする。   なお、前回の列挙データ配列を次の列挙データ配列とする。   要するに列挙データの配列を入れ替えます。→ポインタなどで。  上記のような感じでプログラム(プロセス)の起動と終了の差分が取れます。 ・下に構造体の一例を載せます。 // 列挙管理に使用する最大データ数 #define MAX_ENUMPROCESS (100) // プロセス列挙の構造体を宣言 typedef struct enum_process_t {  HWND hWnd;  LPTSTR lpCaption; } stENUMPROC, *lpENUMPROC; // 起動・終了管理の構造体を宣言 typedef struct startup_log_t {  stENUMPROC stData1[ MAX_ENUMPROCESS ];  stENUMPROC stData2[ MAX_ENUMPROCESS ];  lpENUMPROC lpPrevious;  lpENUMPROC lpCurrent;  lpENUMPROC lpAppend;  DWORD   dwCount; } stSTARTUPLOG, *lpSTARTUPLOG; その他: ・lpPrevious が前回の列挙データ配列の先頭を表すポインタ。  lpCurrent が今回の列挙データ配列の先頭を表すポインタ。  lpAppend、dwCount は列挙時に使う変数。 ・上記の構造体を定義して列挙データを管理すると起動と終了の差分を見つけやすいです。  下に上記で構造体を使った起動と終了の差分を取る main() 関数を載せておきます。  インデント部は全角空白文字にしています。注意。  あと上手くソースを融合して下さい。 サンプル: #include <stdio.h> #include <stdlib.h> #include <windows.h> /* ここに構造体を定義 */ // 関数のプロトタイプ宣言 BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam ); VOID EnumStartupEmpty( lpSTARTUPLOG lpLog ); VOID EnumStartupList( lpSTARTUPLOG lpLog ); VOID EnumStartupNext( lpSTARTUPLOG lpLog ); VOID EnumStartupFirst( lpSTARTUPLOG lpLog ); // メイン関数 int main( void ) {  stSTARTUPLOG Log;    for ( EnumStartupFirst(&Log) ; ; EnumStartupNext(&Log) ){   lpENUMPROC lpA = Log.lpCurrent;   lpENUMPROC lpB = Log.lpPrevious;   DWORD dwCount = 0;      // 差分検査   system( "CLS" );   while ( (lpA->hWnd != NULL) && (lpB->hWnd != NULL) ){    if ( lpA->hWnd == lpB->hWnd ){     printf( "%3d:", ++dwCount );     printf( "[--]%p [%s]\n", lpA->hWnd, lpA->lpCaption );     lpA++;     lpB++;     continue;    }    if ( lpA->hWnd < lpB->hWnd ){     printf( "%3d:", ++dwCount );     printf( "[起動]%p [%s]\n", lpA->hWnd, lpA->lpCaption );     lpA++;    }    else{     printf( "%3d:", ++dwCount );     printf( "[終了]%p [%s]\n", lpB->hWnd, lpB->lpCaption );     lpB++;    }   }   // 起動   while ( lpA->hWnd != NULL ){    printf( "%3d:", ++dwCount );    printf( "[起動]%p [%s]\n", lpA->hWnd, lpA->lpCaption );    lpA++;   }   // 終了   while ( lpB->hWnd != NULL ){    printf( "%3d:", ++dwCount );    printf( "[終了]%p [%s]\n", lpB->hWnd, lpB->lpCaption );    lpB++;   }   printf( "dwCount = %d 個\n", Log.dwCount );   printf( "\n" );   Sleep( 1000 );  }  return 0; } 続く。

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

続き。 // オーナー・ウインドウの判別 #define IsWindowOwner(h) (GetWindow(h,GW_OWNER) == NULL) // トップレベルのプロセスを列挙 BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam ) {  lpSTARTUPLOG lpLog = (lpSTARTUPLOG)lParam;  DWORD dwTextLen;  LPTSTR lpCaption;    if ( IsWindowVisible(hWnd) && IsWindowOwner(hWnd) ){   if ( (dwTextLen = (DWORD)SendMessage(hWnd,WM_GETTEXTLENGTH,0,0)) != 0 ){    if ( (lpCaption = (LPTSTR)malloc(++dwTextLen)) != NULL ){     SendMessage( hWnd, WM_GETTEXT, dwTextLen, (LPARAM)lpCaption );     lpLog->lpAppend->hWnd = hWnd;     lpLog->lpAppend->lpCaption = lpCaption;     lpLog->lpAppend++;     lpLog->dwCount++;    }   }  }  return TRUE; } // 列挙データをクリア VOID EnumStartupEmpty( lpSTARTUPLOG lpLog ) {  lpENUMPROC lpFind;    for ( lpFind = lpLog->lpCurrent ; lpFind->hWnd != NULL ; lpFind++ ){   free( lpFind->lpCaption );   lpFind->hWnd = NULL;   lpFind->lpCaption = NULL;  }  lpLog->lpAppend = lpLog->lpCurrent;  lpLog->dwCount = 0; } // ソート用の比較関数 int compSort( LPCVOID lpData1, LPCVOID lpData2 ) {  HWND hWnd1 = ((lpENUMPROC)lpData1)->hWnd;  HWND hWnd2 = ((lpENUMPROC)lpData2)->hWnd;    if ( hWnd1 < hWnd2 ) return -1;  if ( hWnd1 > hWnd2 ) return +1;  return 0; } // プロセスの列挙 VOID EnumStartupList( lpSTARTUPLOG lpLog ) {  EnumStartupEmpty( lpLog );  EnumWindows( EnumWindowsProc, (LPARAM)lpLog );  lpLog->lpAppend->hWnd = NULL;  lpLog->lpAppend->lpCaption = NULL;  qsort( lpLog->lpCurrent, lpLog->dwCount, sizeof(stENUMPROC), compSort ); } // 続きのプロセスを列挙 VOID EnumStartupNext( lpSTARTUPLOG lpLog ) {  lpENUMPROC lpSwap;    lpSwap = lpLog->lpCurrent;  lpLog->lpCurrent = lpLog->lpPrevious;  lpLog->lpPrevious = lpSwap;  EnumStartupList( lpLog ); } // 最初のプロセスを列挙 VOID EnumStartupFirst( lpSTARTUPLOG lpLog ) {  ZeroMemory( lpLog, sizeof(stSTARTUPLOG) );  lpLog->lpCurrent = lpLog->stData1;  lpLog->lpPrevious = lpLog->stData2;  EnumStartupList( lpLog );  EnumStartupNext( lpLog ); } 以上。

voodoo4500
質問者

お礼

返信おくれて申し訳ありません これでなんとかなりそうです ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

起動を検索した際に取得したbufを使用して動的にタイトルの配列を作成して管理でしょう char *arTitle[3000] = {0}; int arCnt = 0; arTitle[arCount] = (char*)malloc(strlen( buf ) ); if ( !arTile[arcnt] ) {   // 確保できない場合の処理 } else {   strcpy( arTitle[arCnt], buf );   arCnt++; } 終了した場合の表示に if ( flg != 1 ) {   // 前回以前に表示済みかチェック   if ( arTitle[k] ) {     printf( "%s\n", arTitle[k] );     // 動的確保の後始末     free( arTitle[k] );     arTitle[k] = NULL;   } } といった具合です GetWidnowTextで取得する際に何文字受け取ったかを取得しおいてNULL文字を書き込んでおきましょう nLen = ::GetWindowText( (HWND)arry[i], buyf, sizeof( buf ) ); buf[nLen] = '\0'; といった具合です

voodoo4500
質問者

お礼

ありがとうございます 自分も同じ事をかんがえてましたが、 実現できずこまってました。 どうもありがとうございました。

関連するQ&A

  • 「シンボルを見つけれません」というエラーへの対処法

    下記のコードの If(type.compareTo("名詞") == 0); で「シンボルを見つけれません」「シンボル:メソッドif(boolean)」というエラーが出てしまいます。 なぜ、他のif文ではエラーが出ないのにこの行ではエラーが出るのか分かりません。 対処法を教えていただけないでしょうか? public void set_dictionary(String dict_filename) { } public int run(byte[] text, int start, int length, byte[] terms) { String type; //品詞の比較用 byte[] buf1 = new byte[1000]; //textの内容を一時的に格納しておくための配列1 byte[] buf2 = new byte[1000]; //textの内容を一時的に格納しておくための配列2 int i, j, k, count1, count2, FLG; count1 = 0; count2 = 0; k = 0; FLG = 0; for(i = start; i < length; i++) { if(text[i] == '\t') { FLG = 1; count2 = 0; } else if(text[i] == ' ') { FLG = 0; count1 = 0; } else { if(FLG == 1) { buf2[count2++] = text[i]; } else if(FLG == 0) { buf1[count1++] = text[i]; } } if((count2 == 5)&&(FLG == 1)) { type = new String(buf2, 0, 4); If(type.compareTo("名詞") == 0); { for(j = 0; j < count1; j++) { terms[k++] = buf1[j]; } terms[k++] = '/'; } count2 = 0; FLG = 2; } } return k; //term中のデータの長さを返す }

  • 簡単なプログラムの解説お願いします。

    #include<stdio.h> int main(void){ int i, j, temp, array[]={2, 7, 5, 4}; for(i = 0; i < 4; ++i){ for(j = i + 1; j < 4; ++j){ if(array[ i ] < array[ j ]){ temp = array[ i ]; array[ i ] = array[ j ]; array[ j ] = temp; } } for(j = 0; j < 4; ++j){ printf("%d,",array[j]); } printf("\n"); } return 0; } 7,2,5,4, 7,5,2,4, 7,5,4,2, 7,5,4,2, 答えはこのように表示されているんですが なぜこうなるのかが分かりません。 解説お願いします。

  • WM_CLOSEで閉じれないウィンドウを閉じるには?

    以下にソースを張ります。 #include <stdio.h> #include <windows.h> BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lp) { static bool is_first = true; DWORD style = ::GetWindowLong(hwnd, GWL_STYLE); DWORD dwPID; if ( ::IsWindow(hwnd) && ::IsWindowVisible(hwnd) && (style&WS_CAPTION) && !(style&WS_POPUP) ) { char buf[65536]; ::GetWindowText(hwnd, buf, 65535); GetWindowThreadProcessId( hwnd, &dwPID ); if ( buf[0] != '\0' ) { if ( is_first ) is_first = false; else //printf("%c\n", 1); printf("%s%d\n", buf,hwnd); } } return TRUE; } int main (void){ ::EnumWindows(EnumWindowProc, 0); HWND hWnd; printf("プロセスIDを入力:\n"); scanf("%d",&hWnd); if( hWnd != NULL ){ printf( "終了します。-- pause --\n" ); getchar(); PostMessage( hWnd, WM_CLOSE, 0, 0 ); }else{ printf( "起動してないウインドウズです。\n" ); } return 0; } これですとたとえばメモ帳を編集していたときに WM_CLOSE メッセージを送ったときに「変更を保存しますか?」のようなダイアログが出る アプリがあります。これをダイアログが出ずに強制終了するには どうしたらよいでしょか?よろしくお願いします。

  • printfの挿入箇所

    #include <stdio.h> #include <stdlib.h> #define N 500 void bubblesort(int h, int k, int *A); void swap(int i, int j, int *A); int main(void) { int A[N]; int n, i; FILE *file; file=fopen("sortdata", "r"); /* データの読込み */ fscanf(file, "%d", &n); if(n>N) { printf("Illegal array size n = %d for N = %d\n", n, N); exit(1); } for(i=0; i<n; i++) fscanf(file, "%d", &A[i]); /**/ printf("A = "); /**/ printf("\n"); bubblesort(0, n-1, A); /* 配列A[0]からA[n-1]の整列 */ return(0); } /* A[k],...,A[h]の要素をバブルソートによって整列 */ void bubblesort(int h, int k, int *A) { int i, j, p; int no; int test; /* test==1; すでに整列済み */ for(i=h; i<k; i++) /* バブル操作の反復 */ { test=1; for(j=k; j>=i+1; j--) { for(no=0; no<j; no++) printf(" %d",A[no]); if(A[j]<A[j-1]) { printf(" > %d ",A[j]); swap(j, j-1, A); test=0; } else { printf(" < %d ",A[j]); } for(no=j+1; no<=k; no++) printf(" %d ",A[no]); printf("\n"); } printf("\n"); if(test==1) return; } return; } /* Swap A[i] and A[j]. */ void swap(int i, int j, int *A) { int temp; temp=A[i]; A[i]=A[j]; A[j]=temp; return; } 以上のプログラムを A = パス1: 7 5 1 2 8 > 3 7 5 1 2 < 3 8 7 5 1 < 2 3 8 7 5 > 1 2 3 8 7 > 1 5 2 3 8 1 7 5 2 3 8 パス2: 1 7 5 2 3 < 8 1 7 5 2 < 3 8 1 7 5 > 2 3 8 1 7 > 2 5 3 8 1 2 7 5 3 8 パス3: 1 2 7 5 3 < 8 1 2 7 5 > 3 8 1 2 7 > 3 5 8 1 2 3 7 5 8 パス4: 1 2 3 7 5 < 8 1 2 3 7 > 5 8 1 2 3 5 5 8 パス5: 1 2 3 5 7 < 8 1 2 3 5 7 8 比較は15回でした。 交換は8回でした。 と表示させたいのですがうまくいきません。 どなたかご指導よろしくお願いします

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • ソート

    お世話になります。配列のソートなのですが、どうも思い通りの結果になりません。 配列の中から最大値と最小値を探し、最小値を配列0に、最大値を配列の最後に移動します。その2つ以外の数字の順番は変えません。 例) {4,3,2,0,1,2} 最小値は0、最大値は4なので→{0,3,2,1,2,4} {4,3,2,1} → {1,3,2,4} {1,3,2,4,} → {1,3,2,4} 流れとしては、まず最小値を求め配列0に移動させ、次に最大値を求め配列の最後に移動させようと思います。 プログラムは以下のように組みました。 public int[] sortOfSort(int[] array) { int count_min = 0; int min = array[0]; for (int i = 0; i < array.length-1; i++) { // 最小値を求める if (min > array[i + 1]) { min = array[i + 1]; count_min++; // 最小値の配列のインデックスを確保 } } for (int k = count_min; k > 0; k--) { // 最小値の移動 int temp_min = array[k - 1]; array[k - 1] = array[k]; array[k] = temp_min; } int count_max = 0; int max = array[0]; for (int j = 0; j < array.length-1; j++) { // 最大値を求める if (max < array[j + 1]) { max = array[j + 1]; count_max++; // 最大値の配列のインデックスを確保 } } for (int l = count_max; l < array.length-1; l++) { //最大値の移動 int temp_max = array[l + 1]; array[l + 1] = array[l]; array[l] = temp_max; } return array; } 間違っているところがわかりましたら宜しくお願いします。

    • ベストアンサー
    • Java
  • C言語の問題です!!

    すみません。 詳細表示をする際に、未ソート部の先頭要素の上に記号文字「*」を表示し、未ソート部の最小要素の上に記号文字「+」を表示したいと思い、以下のソースプログラムを作成したのですが、結果が何か違う気がします…。どこが違うのか、教えていただけませんか? また、プログラムを修正していただけませんか? #include<stdio.h> #include<stdlib.h> #include<time.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) /*--- 単純選択ソート ---*/ void selection(int a[], int n) { int i, j,k,flg; char *disp[]={" ","[* ]","[ +]","[*+]"}; for (i = 0; i < n - 1; i++) { int min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) { min = j; } } for (k = 0; k < n; k++) { flg=0; if(k==i) flg|=1; if(k==min) flg|=2; printf("%s",disp[flg]); } printf("\n"); for (k = 0; k < n; k++) printf("[%2d]", a[k]); printf("\n"); swap(int, a[i], a[min]); } } int main(void) { int i, nx; int *x; printf("要素数 : "); scanf("%d", &nx); x = calloc(nx, sizeof(int)); srand(time(NULL)); for (i = 0; i < nx; i++) { x[i] = rand() % 100; printf("x[%d] = %d\n", i, x[i]); } selection(x, nx); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); free(x); return 0; }

  • 配列を戻り値にして逆行列を求める関数

    #include(stdio.h) int main(){ double a[4][4]={{1,2,0,-1},{-1,1,2,0},{2,0,1,1},{1,-2,-1,1}}; //入力用の配列 double inv_a[4][4]; //ここに逆行列が入る double buf; //一時的なデータを蓄える int i,j,k; //カウンタ int n=4; //配列の次数 //単位行列を作る for(i=0;i<n;i++){ for(j=0;j<n;j++){ inv_a[i][j]=(i==j)?1.0:0.0; } } //掃き出し法 for(i=0;i<n;i++){ buf=1/a[i][i]; for(j=0;j<n;j++){ a[i][j]*=buf; inv_a[i][j]*=buf; } for(j=0;j<n;j++){ if(i!=j){ buf=a[j][i]; for(k=0;k<n;k++){ a[j][k]-=a[i][k]*buf; inv_a[j][k]-=inv_a[i][k]*buf; } } } } //逆行列を出力 for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf(" %f",inv_a[i][j]); } printf("\n"); } } という、4次元正方行列の逆行列を求めるプログラムがあるのですが これを複数の行列の逆行列が求められる関数にする場合を教えてください・・行列は配列で作ってるのでよくわかりません、お願いします

  • 迷路作成のプログラミング

    迷路作成のプログラミングをC++で作ったのですが、エラーが出ます。 どのように直せば良いか教えてください。 エラー内容は 'randoomize': 識別子が見つかりませんでした。 16 進型定数には、少なくとも 1 桁の 16 進数が必要です。 'kbhit': 識別子が見つかりませんでした 'getch': 識別子が見つかりませんでした です、、お願いします。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define YOKO_MAX 200 #define ESC '\xlb' int n; int map[YOKO_MAX],count[YOKO_MAX]; int rr() { return rand() % 10>3; } void tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) if(map[i]!=map[i+1] && rr()) { k=map[i+1]; count[k]=0; for(j=0; j<n; j++) if(map[j]==k) { map[j]=map[i]; count[map[i]]++; } printf(" "); } else printf("■"); printf("■\n"); } void last_tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) { if(map[i]==map[i+1]) printf("■"); else { k=map[i+1]; for (j=0; j<n; j++) if (map[j]==k) map[j]=map[i]; printf(" ",map[i]); } } printf("■\n"); } void yoko() { int i,j; for (i=0; i<n; i++) if (count[i]>1 && rr()) { printf("■■"); for(i=0; i<n; i++) { if (count[j]==0) { count[j]=1; count[map[i]]--; map[i]=j;break; } } } else { printf("■"); } printf("■\n"); } void enter() { int i,k; k=rand() % n; for (i=0; i<n; i++) if(i==k) { printf("■"); } else { printf("■■"); } printf("■\n"); } void initialize() { int i; for (i=0; i<n; i++) { map[i]=i; count[i]=1; } randoomize(); } int main() { printf("無限に大きな迷路\n"); do { printf("\n迷路の横幅(2~200)?"); scanf("%d",&n); } while (n<2||n>=YOKO_MAX); printf("\n ESCキーを押すと止まる。\n"); initialize(); enter(); do { tate(); yoko(); } while (!kbhit()||getch()!=ESC); last_tate(); enter(); }

  • strcpyのsegmentation fault

    118 char* argv[argc+1]; 120 121 for(i = 0; i < argc ; i++) 122 { 123 char tmp[BUF]; 124 while(buf[k]!=' ' & buf[k]!='\0') 125 { 126 tmp[j] = buf[k]; 127 j++; 128 k++; 129 } 130 tmp[j]='\0'; 131 j=0; 132 k++; 133 strcpy(argv[i],tmp); 134     //arg v[array]=tmp; 135 printf("temp = %s argv = %s\n",tmp,argv[array]); 136 } 137 argv[i+1]=tmp2; 133番の部分が問題です 最初に回る時にはprintfの結果が出ます temp = test argv = test でも2回目からはerrorになるます argv[1]は char*刑なのでstrcpyに何の問題もないと思いますが どんな問題でerrorがでるのでしょうか? これはlineを呼んで int main(int argc, char* argv[]) のargv部分をようにするためのcodeです errorの理由とか char* argv[]部分を簡単に作る方法を知りたいです お願いします

専門家に質問してみよう