我希望你帮助我做一些我不确定的事情,即使编译器没有抱怨它们:
这里我需要编写一个获取输入和输出的程序,在输入文件中存储整数,我不知道它们的数量除以空格,我需要读取这些数字,按数字比较的总和对它们进行排序并在输出文件中打印出已排序的数字。这是我写的,之后关于这段代码的一些简短问题:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
int myComp(const void *a, const void *b){
int x=(*(int*)a);
int y=(*(int*)b);
int sumForx=0;
int sumFory=0;
while (x){
sumForx=sumForx+(x%10);
x=(x-(x%10))/10;
}
while (y){
sumFory=sumFory+(y%10);
y=(y-(y%10))/10;
}
if (x>y) return 1;
else if (x<y) return -1;
else return 0;
}
int main(int argc, char** argv) {
FILE* inFile;
FILE* outFile;
int size=0;
int tmp;
if (argc!=3) {
printf("Please enter 3 arguments");
assert(0);
}
inFile=fopen(argv[1], "r");
if (inFile==NULL) {
printf("path to the input file has not found");
assert(0);
}
outFile=fopen(argv[2], "w");
if (outFile==NULL) {
printf("path to the output file has not found");
assert(0);
}
while (fscanf(inFile, "%d", &tmp)==1) {
size++;
}
int arr[size];
fseek(inFile, 0, SEEK_SET);
int i=0;
while (fscanf(inFile, "%d", &tmp)==1) {
arr[0]=tmp;
i++;
}
qsort(arr,size,sizeof(int),myComp);
int j;
for (j=0;j<size;j++){
fprintf(outFile,"%d",arr[j]);
fprintf(outFile,"%c",' ');
}
fclose(inFile);
fclose(outFile);
return 1;
}
我一直在主要的,不同的地方定义新的变量 - 我记得我不应该这样做,因为所有的变量都必须在函数的开头定义,除非有内部函数的局部变量/括号,这不是这里的情况 - 但编译器仍然没有这个 - 这是正确的做法?
如果答案是(1)是“你必须在函数的开头定义所有变量” - 在我的情况下,我必须定义动态int* arr
并在我计算大小后为它分配空间,否则我不能使用int arr[size]
,因为在所有变量已经定义之后计算大小,包括整数数组。
3.我想在打印到文件时输入这些数字之间的空格,每次输入整数后fprintf(outFile,"%c",' ');
是否正确?
4.欢迎任何其他更正!
答案 0 :(得分:1)
在函数开头声明所有变量的要求可追溯到标准的前一版本(C89,它已过时的C99,已过时的C11)。
由于您使用的是可变长度数组(arr[size]
),这在该标准的前一版本中是不可能的,因此您显然使用了一个不太合适的中间编译器自1999年以来不再适用的限制。; - )
至于打印空格,fprintf( outfile, " " )
或(甚至更好)fputc( ' ', outfile )
会这样做。
至于进一步的更正,我习惯于不阅读/评论未注释的来源。你有一种我非常不同意的编码风格,但至少你应用它是一致的。 ; - )
答案 1 :(得分:0)
fprintf(outFile, " ");
也完全合法。答案 2 :(得分:0)
为此,您的代码似乎很好,但我使用的是:
fprintf(outFile, "%d ", arr[j]);
在单行中实现类似功能。
答案 3 :(得分:0)
1:只要您使用的是支持C99标准或更高版本的编译器,就可以在函数体中的任何位置声明变量。早期编译器要求您在块作用域的开头声明变量,正如您所说。
然而,通过限制某些变量的范围,您可以做得比在代码中更好。而不是:
int j;
for (j = 0; j < size; j++) { ... }
您可以将其简化为:
for (int j = 0; j < size; j++) { ... }
这也限制了j
语句后块可以访问for
的范围。
2:动态大小的数组仅在C99及更高版本中受支持,因此代码不会在不支持新标准的编译器上编译。
3:您只需将额外空格添加到初始格式字符串:
fprintf(outfile, "%d ", arr[j]);
答案 4 :(得分:0)
printf("Please enter 3 arguments");
可执行文件名通常不被称为参数,因此通常为
printf("Please enter 2 arguments - input filename and output filename e.g.:\n");
printf("%s file1.txt file2.txt\n",argv[0]);
此
arr[0]=tmp;
应该是
arr[i]=tmp;