c言語のプログラムで、整数を入力して結果を表示するプログラムなのですが、
コンパイルして、a.exeを実行して、整数を入力したら、
Microsoft Windowsから
「a.exeは動作を停止しました」
「問題が発生したため、プログラムが正しく動作しなくなりました。」
と出ました。

それまでは順調に動いていたのに、それ以降類似のプログラムでも同じようになりました。

しばらくは「問題のレポートと解決策」にて
「Trojan.PWS.Legmir.AD / W32.Ahlem.A@mmウイルスをコンピュータから除去する」という
Windowsの警告メッセージが表示されましたが、繰り返しているうちに出なくなりました。

「a」という名前が悪いと聞いて、名前を長短いろいろ変えてもだめでした。
ほかの「a.exe」も消してみましたがだめでした。

Windows Vista MinGW環境でコマンド プロンプトを使用してます。
ウイルスバスター2011も使ってます。

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

A 回答 (1件)

その現象はWindows Vista特有で、Virus Busterをインストールしている時に限り表示される、エラーメッセージです。



私がいろいろ調べて、いくつかおすすめのサイトを見つけましたのでそちらを見てもらってもいいと思います。

http://d.hatena.ne.jp/fkm/20071116

http://social.technet.microsoft.com/Forums/ja-JP …

この2つです。

原因としてはVirus BusterがVistaの初期設定で動作していると、一文字の.exeファイルが、よくある「隠れトロイの木馬」と誤認してでるエラーメッセージです。よって、ウイルスに感染したわけではありません。

解決法としては、文字数を変えてもエラーが消えないというのはおかしいです。

まず、例えば「test.notepad」とコマンドラインに入力して「test」という名前のノートパッド新規ファイルを起動、プログラムソースを書いて上書き保存。その後、test.gcc -o test.exeと入力してコンパイル成功はして、プログラムの実行とはいくのでしょうか。

そこまではうまくいく場合は「Virus Buster」の一時停止を行わないと、毎回「エラー」が出ます。毎回、停止するのが面倒なときは、せっかく買ってもったいないですけど、プログラミングに専念するのなら「アンインストール」が一番簡単です。

コンパイル自体成功しない場合は、「Virus Buster」をアンインストールすれば解決します。

他のウイルス対策ソフトなら、トロイの木馬と誤認しませんよ。Nortonとかなら最良ですけどね。

でも、プログラミングに専念しないなら、毎回、Virus Busterを「一時停止」→「再開」しても十分です。

この回答への補足

丁寧な回答ありがとうございます。

上にあげてもらったサイトは質問前に見ていたのですが…

test.cを -o test.exeとし、コンパイラは成功します。

その後、「整数を入力してください: 」と出て
数字を入力後、Enterキーを押すととまります。

ウイルスバスターを停止しても、変化なしです…

補足日時:2011/04/10 15:35
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QC言語 自然数の四則演算 エラー原因不明

プログラミング初心者です
自然数の四則演算のプログラムを作ったところ
コンパイル時にはエラーは起こりませんでしたが実行時にエラーが起こり、動作が停止してしまいました。
自分で原因が特定できなかったのでこちらを頼らせてもらうことにしました。
ご教授お願いします。
<環境>
Windows 7 Home Premium 64-bit
Visual Studio 2013


#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>

int main( void )
{

char str[2][128]={{0}};
int i,j,err=0,cont=0,wari=0;
double c,d,dans;
long a,b,lans;


puts("自然数の四則演算('+''-''*''/')を計算");

//被加数,被減数,被乗数,被除数と演算の判定
i=0;
while((str[0][i]=getchar())!='\n'){
if(str[0][0]=='+' || str[0][0]=='*' || str[0][0]=='/' || str[0][0]=='-'){
err=1;
}
if(str[0][i]=='+' || str[0][i]=='*' || str[0][i]=='/' || str[0][i]=='-'){
cont=1; //2つ目の数字を読み込むか否かの判定
break;
}else if(isdigit(str[0][i])==0){
err=1; //数字と演算方法以外の入力はエラー
}
i++;
}

//加数,減数,乗数,除数の判定
if(cont==1 && err!=1){
j=0;
while(str[1][j]!='\n'){
if(isdigit(str[0][i])==0){
err=1; //数字以外の入力があればエラー
}
j++;
}
str[1][j]='\0';

if(err==1){
printf("エラー入力");
return 0;
}

switch(str[0][i]){
case '+':
str[0][i]='\0';
a=atol(str[0]);
b=atol(str[1]);
lans=a+b;
break;
case '-':
str[0][i]='\0';
a=atol(str[0]);
b=atol(str[1]);
lans=a-b;
break;
case '*':
str[0][i]='\0';
a=atol(str[0]);
b=atol(str[1]);
lans=a*b;
break;
case '/':
str[0][i]='\0';
c=atol(str[0]);
d=atol(str[1]);
dans=(double)c/d;
wari=1; //割り算の判定
break;
default:
break;
}
}

if(err==0){
if(wari==0){
printf("計算結果:%ld\n",lans);
}else if(wari==1){
printf("計算結果:%f\n",dans);
}
}else{
printf("エラー入力です\n");
}
return 0;
}

プログラミング初心者です
自然数の四則演算のプログラムを作ったところ
コンパイル時にはエラーは起こりませんでしたが実行時にエラーが起こり、動作が停止してしまいました。
自分で原因が特定できなかったのでこちらを頼らせてもらうことにしました。
ご教授お願いします。
<環境>
Windows 7 Home Premium 64-bit
Visual Studio 2013


#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>

int main( void )
{

char str[2][128]={{0}};
int i,j,err=0,cont=0,wari=0;
double c,d,dans;
lon...続きを読む

Aベストアンサー

もう少しちゃんと見てみましたが、やはり不思議な仕様のコードですね。

> //被加数,被減数,被乗数,被除数と演算の判定
> i=0;
> while((str[0][i]=getchar())!='\n'){

と書いているので'\n'で入力が終了することを期待しているのでしょうが、実際に四則演算を入力しようとすると、次のところでループから脱出します。

> if(str[0][i]=='+' || str[0][i]=='*' || str[0][i]=='/' || str[0][i]=='-'){
> cont=1; //2つ目の数字を読み込むか否かの判定
> break;

例えば、"1+2"という入力をしたら、"1+"(ただし、NULL文字では終わっているとは限らない)がstr[0]に入った状態でループを出ます。

その後、次のコードを実行します。

> //加数,減数,乗数,除数の判定
> if(cont==1 && err!=1){
> j=0;
> while(str[1][j]!='\n'){

なぜか、str[1]となっているので、中に何が入っているか不明なところを\nが出てくるまで探し続けます。

> if(isdigit(str[0][i])==0){
> err=1; //数字以外の入力があればエラー
> }
> j++;
> }

と、数値以外が来てもお構いなしにstr[1]の中身を読み続け、str[1]に運良く'\n'が入っていない限り、OSがメモリーへのアクセス違反を検出して強制終了となるまでメモリーを読み続けるでしょう。

ちなみに、whileの条件を while(str[1][j]!='\n'){としてもダメです。なぜなら、'\n'が入っていないから。

他にも色々と不思議なところはありますが、
多分、2項の自然数の四則演算をするプログラムだと思ったので、質問文にあるコードを元に、プログラムを読みにくくするところを省いて多分やりたいことだろうというコードに書き換えてみました。

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>

int
main(void)
{

char str [128] = {0};
int i , j, err = 0, op_pos = 0, wari = 0;
double dans;
long a , b, lans;


puts("自然数の四則演算('+''-''*''/')を計算");

//被加数, 被減数, 被乗数, 被除数と演算の判定
i = 0;
while ((str[i] = getchar()) != '\n') {
if (str[0] == '+' || str[0] == '*' || str[0] == '/' || str[0] == '-') {
err = 1;
}
if (str[i] == '+' || str[i] == '*' || str[i] == '/' || str[i] == '-') {
//オペレーターの位置を保存
if (op_pos != 0) {
err = 1;
break;
}
op_pos = i;
} else if (!isdigit(str[i])) {
err = 1;
//数字と演算方法以外の入力はエラー
}
i++;
}

if (err == 1) {
printf("エラー入力");
return 0;
}
a = atol(&str[0]);
b = atol(&str[op_pos + 1]);
switch (str[op_pos]) {
case '+':
lans = a + b;
break;
case '-':
lans = a - b;
break;
case '*':
lans = a * b;
break;
case '/':
if (b == 0) {
// devided by 0.
err = 1;
} else {
dans = (double)(a) / (double)(b);
wari = 1;
}
break;
default:
break;
}

if (err == 0) {
if (wari == 0) {
printf("計算結果:%ld\n", lans);
} else if (wari == 1) {
printf("計算結果:%f\n", dans);
}
} else {
printf("エラー入力です\n");
}
return 0;
}

今後、1+2*3に7と答えるようにするなら、字句解析や演算子順序解析に付いて勉強したほうがよいかもしれません。

もう少しちゃんと見てみましたが、やはり不思議な仕様のコードですね。

> //被加数,被減数,被乗数,被除数と演算の判定
> i=0;
> while((str[0][i]=getchar())!='\n'){

と書いているので'\n'で入力が終了することを期待しているのでしょうが、実際に四則演算を入力しようとすると、次のところでループから脱出します。

> if(str[0][i]=='+' || str[0][i]=='*' || str[0][i]=='/' || str[0][i]=='-'){
> cont=1; //2つ目の数字を読み込むか否かの判定
> break;

例えば、"1+2"という入力をしたら、"1+"(ただし、N...続きを読む

Q動作を停止しましたと表示され、停止します。

動作を停止しましたと表示され、アプリケーション停止します。

問題の詳細



発生元
怪盗攻略ブラウザ2

概要
動作が停止しました

日付
‎2013/‎08/‎07 0:19

状態
レポートが送信されました

説明
障害が発生しているアプリケーションのパス: C:\Users\******\AppData\Local\Apps\2.0\8B9RETX1.HAB\QDOQORNC.VKJ\kait..tion_8149fee0edf1ff73_0002.0001_5674af9cba542bd5\KaitoBrowser2_1.exe

問題の署名
問題イベント名: APPCRASH
アプリケーション名: KaitoBrowser2_1.exe
アプリケーションのバージョン: 1.0.0.0
アプリケーションのタイムスタンプ: 51ef9c9c
障害モジュールの名前: KERNELBASE.dll
障害モジュールのバージョン: 6.1.7601.18015
障害モジュールのタイムスタンプ: 50b83c8a
例外コード: 4000001f
例外オフセット: 00013219
OS バージョン: 6.1.7601.2.1.0.768.3
ロケール ID: 1041
追加情報 1: 12e5
追加情報 2: 12e5e8e1c146c520e06bac21034ebc4f
追加情報 3: 3670
追加情報 4: 367002d938052abab76c4a26ecb98de3

この問題に関するその他の情報
バケット ID: 3728007683

動作を停止しましたと表示され、アプリケーション停止します。

問題の詳細



発生元
怪盗攻略ブラウザ2

概要
動作が停止しました

日付
‎2013/‎08/‎07 0:19

状態
レポートが送信されました

説明
障害が発生しているアプリケーションのパス: C:\Users\******\AppData\Local\Apps\2.0\8B9RETX1.HAB\QDOQORNC.VKJ\kait..tion_8149fee0edf1ff73_0002.0001_5674af9cba542bd5\KaitoBrowser2_1.exe

問題の署名
問題イベント名: APPCRASH
アプリケーション名: KaitoBrowser2_1.exe
ア...続きを読む

Aベストアンサー

追加
>KERNELBASE.dll

VB***、.NET Framework*関連の場合もあります。
VB PowerPacksSetup.exeを実行インストールして解決した事例
参考URL

参考URL:http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=30385&no=0&KLOG=3

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。

Q配列の要素をまとめて比較したい

例えば
array1[5] = {0, 1, 2, 3, 4, 5}
array2[5] = {0, 1, 2, 3, 4, 5}
一つ一つ比較せずに配列array1とarray2の要素は全く同じだということを判断する方法はないでしょうか?

Aベストアンサー

比較コードを「自分で書きたくない」のであれば
memcmp はいかがでしょうか。

参考URL:http://msdn.microsoft.com/ja-jp/library/zyaebf12.aspx

QC言語の2次元配列 容量が大きすぎる場合の対処方法

私はC言語をもちいて2次元配列を作ろうとしています。

しかし、配列数が double c[10000][10000];
と大きいものにすると、エラーになってしまいます。

もちろん小さい double c[10][10];
のような配列では問題ありません。

malloc関数とかも調べたのですがなかなかいい文献が見つからずに
困っています。
どうかいいご意見があればよろしくお願いします。

Aベストアンサー

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fread(&c, 1,8, fp);
 return c;
}

void write_c(FILE *fp, double *c, int x, int y) {
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fwrite(c, 1,8, fp);
}

int main(void)
{
 FILE *fp;
 double c,s;
 int x,y;
 int a[10000],b[10000];
 
 fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
 
 for(x=0; x<10000; x++) {
  for(y=0; y<10000; y++) {
   c=a[x]*b[y];
   write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
  }
 }
 
 for(x=0; x<10000; x++) {
  s=0;
  for(y=0; y<10000; y++) {
   s += read_c(fp, x,y);// s += c[x][y]; の意味
  }
  b[x] = s / 10000;
 }
 
 fclose(fp);
 return 0;
}

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qfopne で失敗する原因

fopenで失敗する原因とはなんですか?

Aベストアンサー

#1の方の回答に加えて...

・ファイル名の文字列がでたらめ(存在するかどうか以前の問題)
・指定したファイル名が実はディレクトリだった。
・ファイル名に空ポインタまたは不正なポインタを渡した。
・オープンモードに空ポインタまたは不正なポインタを渡した。
・オープンモードの形式が不正
・メモリ不足でバッファ(実装によってはファイル記述子も)の割り付けに失敗した。
・同名の関数またはマクロをユーザーが定義した。
・関数原型なしで呼び出した。
・他のスレッド等で、同じファイルに対する操作中(再入可能とは限らないので)

Q大きな配列を使うには?

BCCにJavaからポーティングしましたが、配列 int array[max]で、150000程度の大きさを超えると、メモリ不足で止まってしまいます。BCCかリンカのオプションで、ヒープやスタックサイズを変更する具体的な方法、または、大きな配列を上手く使う方法を教えてください。(プログラムはこんな感じ。)

#define max_array 140000 /* このサイズを変更したい */
void main() {
char array[max_array] ;

この後、ヒープも使うのですが、(そのメモリ確保も必要)そこまで
行かない。。。。

(MSのVC++2005でも、同様になりました。)

10数年ぶりにプログラムをしている初心者です。
よろしくお願いします。

Aベストアンサー

スタックサイズのオプションについては、既にでています(-S:)が
スタックにあまり大きなメモリを確保するのはよろしくないと思います。
static にするか extern にするか malloc すれば、ヒープに確保されます。

QC言語で簡単なゲームを作る方法

僕はC言語を学び始めた程度ですが、一番簡単に作れるゲームとその作り方(ソース)を教えて下さい。お願いします。

Aベストアンサー

★じゃんけんゲームのソースです。

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP_KATI : TYP_MAKE);
  case JKN_CHOKI:  return ((computer == JKN_PA) ? TYP_KATI : TYP_MAKE);
  case JKN_PA:  return ((computer == JKN_GOO) ? TYP_KATI : TYP_MAKE);
  default:   return -1;
 }
}

// じゃんけんゲーム
int main( void )
{
 // ゲーム変数
 int count;  // 勝負回数
 int kati = 0; // 勝ちカウンタ
 int make = 0; // 負けカウンタ
 // 一時変数
 int human;  // キー入力の一時変数(人間用)
 int computer; // 乱数発生の一時変数(コンピュータ用)
 
 // (6)じゃんけん勝負を10回行う
 printf( "★じゃんけんゲーム(10回勝負)\n\n" );
 for ( count = 1 ; count <= 10 ; count++ ){
  // (1)人間:3つの状態を入力
  printf( "%2d回目…[1]グー [2]チョキ [3]パー を入力して下さい:", count );
  do {
   // (2)キー入力
   switch ( getche() ){
    case '1': human = JKN_GOO; break;
    case '2': human = JKN_CHOKI; break;
    case '3': human = JKN_PA; break;
    default: human = -1; break;
   }
  } while ( human == -1 );
  
  // (3)コンピュータ:3つの状態を乱数で決める
  computer = (rand() % 3);
  // (4)人間vsコンピュータの勝負
  switch ( check(human,computer) ){
   case TYP_KATI:
    kati++;
    printf( "⇒勝ち。\n" );
    break;
   case TYP_MAKE:
    make++;
    printf( "⇒負け。\n" );
    break;
   case TYP_AIKO:
    printf( "⇒引き分け。\n" );
    break;
   default:
    printf( "⇒エラー。\n" );
    break;
  }
 }
 // (7)結果表示
 printf( "\n★じゃんけんゲームの結果\n" );
 printf( "人間    :%d 回勝ち\n", kati );
 printf( "コンピュータ:%d 回勝ち\n", make );
 printf( "※引き分け回数は %d 回でした。\n", (10 - kati - make) );
 return 0;
}

注意:全角空白をタブ文字に変換して下さい。

★じゃんけんゲームのソースです。

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP...続きを読む

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報