2017-07-15 9 views
0

空のファイルを生成するプログラムを作成しようとしています。プログラムを実行しようとすると、コンソールからの入力を受けた後にクラッシュします。My Cプログラムがクラッシュする

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

int create(char* filename) 
{ 
    char filext[10]; 
    printf("\nEnter File Extension :"); 
    fgets(filext); 
     FILE* fp; 
     fp = fopen(strcat(filename,strcat(".",filext)),"w"); 
     if(!fp) 
     { 
      return 0; 
     } 
     fclose(fp); 
     return 1; 

} 
int main(int argc , char* argv[]) 
{ 
    int f; 
    int i; 
    char buffer[33]; 
    if (argc == 3) 
    { 
     for(i = 0; i < atoi(argv[2]) ; i++) 
     { 
      f = create(strcat(argv[1],itoa(i,buffer,10))); 
      if(f==0) 
      { 
       printf("error in creating files . check uac!!!"); 
      } 
      else{ 
       printf("\nfile Created ...\n"); 
      } 
     } 
    } 
    else{ 
     printf("syntax Error"); 
    } 
    return 0; 
} 

私はこのプログラムを実行しようとすると、私は拡張子にプログラムがクラッシュを入力した後、次の出力

F:\selfcreatedtools\filegen>gcc gen.c 

F:\selfcreatedtools\filegen>a level 100 

Enter File Extension :php 

を取得します。 私はプログラミングの初心者です。

+1

'argv [1]'に余分なマテリアルがないので、 'strcat(argv [1]、...)'は実行できません。あなたは何とかスペースを割り当てなければなりません。 'strcat()'を使う他の行についても同様です。そして、 '' gets() ''は使用するにはあまりにも危険です!](http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not-利用される)。 –

+0

'argv [1]'と ''。 "'は文字列を結合する余分なスペースを持たない。 – BLUEPIXY

+1

'gets()'の使用は危険です。 'fgets()'を試してください。 –

答えて

1

あなたの主な問題は、

strcat(filename, "."); 
strcat(filename, filext); 
fp = fopen(filename, "w"); 


を試してみてください
fp = fopen(strcat(filename,strcat(".",filext)),"w");

strcat(".",filext)一部にあり、関数定義ヘッダはSIZEが小さい値である int create(char filename[SIZE])を(行われた場合、それは良いかもしれませんあなたがstrcat()を使用しているので、ユーザ定義の楽しみの中の文字列を変更するために、の代わりにint create(char* filename)のサイズがfilenameになります) ction create()。文字列が他のものに割り当てられたメモリに侵入した場合、エラーの原因となる不正なメモリアクセスは望ましくありません。

同様の問題がBLUEPIXYコメントにソリューションを提供しているためJonathan Lefflerによって指摘されるようargv[1]で文字列を変更するstrcat()を用いてあります。

+1

ありがとうございます。これは私の多くを助けた –

関連する問題