有人可以帮我吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <direct.h>
#pragma warning(disable : 4996)
int main(int argc, char*argv[]) {
if (argc < 2 ) {
printf("Not enough arguments given: usage [name]");
return;
}
char* name=(char*)malloc(strlen(argv[1]));
name = argv[1];
char* name2 = (char*)malloc(strlen(name));
strcpy(name2, name);
strcat(name, ".cpp");
strcat(name2, ".h");
name[strlen(name) + 1] = '\0';
name2[strlen(name2)+ 1] = '\0';
FILE * fp = fopen(name, "w");
FILE * fp2 = fopen(name2, "w");
free(name);
free(name2);
return 0;
}
答案 0 :(得分:4)
您分配的时间不足
char* name=(char*)malloc(strlen(argv[1])); name = argv[1]; char* name2 = (char*)malloc(strlen(name)); strcpy(name2, name); strcat(name, ".cpp"); strcat(name2, ".h");
因为您需要用于“ .cpp”和“ .h”的空间而又不会忘记null终止字符,所以解决方案可以是:
size_t alen = strlen(argv[1]);
char * h = malloc(alen + 3);
char * cpp = malloc(alen + 5);
strcpy(h, argv[1]);
strcpy(h + alen, ".h");
strcpy(cpp, argv[1]);
strcpy(cpp + alen, ".cpp");
以及免费的 h 和 cpp
在
name[strlen(name) + 1] = '\0'; name2[strlen(name2)+ 1] = '\0';
您已经假定具有空终止字符可以使用 strlen 。 (当然,使用我上面的建议,这些行是不存在的)
在
free(name);
您释放了argv[1]
,但您不能这样做。 (当然,根据我上面的建议,您的两个最初的免费帐户不存在)
在
if (argc < 2 ) { printf("Not enough arguments given: usage [name]"); return; }
您什么也不返回,应该是 int
您还需要检查 fopen 是否成功,以及 malloc ,即使我们通常有足够的内存来存储需要较少内存的程序
您的主要可以是:
int main(int argc, char*argv[]) {
if (argc < 2 ) {
printf("Not enough arguments given: usage %s [name]\n", *argv);
return -1;
}
size_t alen = strlen(argv[1]);
char * h = malloc(alen + 3);
char * cpp = malloc(alen + 5);
if ((h == NULL) || (cpp == NULL)) {
puts("not enough memory");
return -1;
}
strcpy(h, argv[1]);
strcpy(h + alen, ".h");
strcpy(cpp, argv[1]);
strcpy(cpp + alen, ".cpp");
FILE * fph = fopen(h, "w");
if (fph == NULL) {
printf("cannot open %s\n", h);
return -1;
}
FILE * fpcpp = fopen(cpp, "w");
if (fcpp == NULL) {
printf("cannot open %s\n", cpp);
return -1;
}
free(h);
free(cpp);
/* write in files */
fclose(fh);
fclose(fcpp);
return 0;
}