2017-07-15 61 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

谢谢。这帮了我很多 –