2017-07-15 62 views
0

我正在嘗試創建一個程序來生成空文件。但是當它嘗試運行該程序時,它會在從控制檯接收輸入後崩潰。我的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 

進入擴展程序崩潰之後。 我是c編程的初學者。

+1

你不能'strcat(argv [1],...)'因爲'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

你的主要問題出在
fp = fopen(strcat(filename,strcat(".",filext)),"w");

strcat(".",filext)部分嘗試

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


如果函數定義標題是取得 int create(char filename[SIZE])(其中SIZE是價值減去它可能會更好因爲您使用strcat()來修改用戶定義的樂趣中的字符串,因此將使用filename而不是int create(char* filename)) ction create()。如果字符串侵入分配給其他內存的內存,則不會希望導致錯誤的非法內存訪問。

類似的問題是有使用strcat()修改在argv[1]通過Jonathan Leffler爲其BLUEPIXY提供評價的溶液中指出的字符串。

+1

謝謝。這幫了我很多 –