在这个exrecie中,我得到了一个输入和输出文件。输入文件包含一个数字,然后是一个长度不超过10的字符串,我需要对它们进行排序并将它们输出到输出文件中。我定义了char** arrStr
,其中包含最多10个字符串的所有字符串。
我试图理解以下代码是否可行(出于某种原因我无法在Eclipse上运行)我主要担心的是正确复制字符串而不是丢失信息。我写了一张纸条“这样可以吗?”在我最关心的声明旁边,我会感谢任何其他更正。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
int comp(const void* p1, const void* p2) {
return strcmp((char*)p1, (char*) p2);
}
int main(int argc, char** argv) {
FILE* fin;
FILE* fout;
int N;
char** arrStr;
char str[11];
int i;
if (argc!=3) {
printf("Please enter the program's name and two paths");
assert(0);
}
fin=fopen(argv[1], "r");
if (fin==NULL) {
printf("path 1 is not valid");
assert(0);
}
fout=fopen(argv[2], "w");
if (fout==NULL) {
printf("path for file 2 is not valid");
fclose(fin);
assert(0);
}
fscanf(fin, "%d", &N);
arrStr=(char**)calloc(N, sizeof(char)*11);
for (i=0; i<N; i++) {
fscanf(fin, "%s", str);
strcpy(arrStr[i], str); /*is it ok?*/
}
qsort(arrStr, N, sizeof(char)*11, comp);
for (i=0; i<N; i++) {
if (i==N-1)
fprintf(fout, "%s", arrStr[i]);
else
fprintf(fout, "%s,", arrStr[i]);
}
fclose(fin);
free(arrStr);
fclose(fout);
return 1;
}
答案 0 :(得分:0)
该行
strcpy(arrStr[i], str); /*is it ok?*/
不没关系。您复制到NULL
指针。
对于这种情况,请使用例如strdup
代替strcpy
:
arrStr[i] = strdup(str);
不要忘记稍后释放这个字符串。
您也在错误地分配数组:
arrStr=(char**)calloc(N, sizeof(char)*11);
这不分配字符串数组,它分配N * 11
个字节。改为:
arrStr = calloc(N, sizeof(char *));