在函数开头定义变量和“fprintf”

时间:2012-09-17 08:26:30

标签: c variables scanf

我希望你帮助我做一些我不确定的事情,即使编译器没有抱怨它们:

这里我需要编写一个获取输入和输出的程序,在输入文件中存储整数,我不知道它们的数量除以空格,我需要读取这些数字,按数字比较的总和对它们进行排序并在输出文件中打印出已排序的数字。这是我写的,之后关于这段代码的一些简短问题:

#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. 我一直在主要的,不同的地方定义新的变量 - 我记得我不应该这样做,因为所有的变量都必须在函数的开头定义,除非有内部函数的局部变量/括号,这不是这里的情况 - 但编译器仍然没有这个 - 这是正确的做法?

  2. 如果答案是(1)是“你必须在函数的开头定义所有变量” - 在我的情况下,我必须定义动态int* arr并在我计算大小后为它分配空间,否则我不能使用int arr[size],因为在所有变量已经定义之后计算大小,包括整数数组。

  3. 3.我想在打印到文件时输入这些数字之间的空格,每次输入整数后fprintf(outFile,"%c",' ');是否正确?

    4.欢迎任何其他更正!

5 个答案:

答案 0 :(得分:1)

在函数开头声明所有变量的要求可追溯到标准的前一版本(C89,它已过时的C99,已过时的C11)。

由于您使用的是可变长度数组(arr[size]),这在该标准的前一版本中是不可能的,因此您显然使用了一个不太合适的中间编译器自1999年以来不再适用的限制。; - )

至于打印空格,fprintf( outfile, " " )或(甚至更好)fputc( ' ', outfile )会这样做。

至于进一步的更正,我习惯于不阅读/评论未注释的来源。你有一种我非常不同意的编码风格,但至少你应用它是一致的。 ; - )

答案 1 :(得分:0)

  1. 这取决于您使用的C版本。如果您使用ANSI C(c89),您将收到有关此问题的警告或错误。但是大多数(如果不是全部)现代编译器几乎在代码中的任何地方都支持声明。
  2. 这又取决于您的编译器。旧的编译器无法像这样分配静态数组,现代编译器可以。
  3. fprintf(outFile, " ");也完全合法。

答案 2 :(得分:0)

  1. 如果您使用gcc,它将允许您将变量放在函数中的任何位置。但是,其他编译器(例如MSVC 2008)遵循 ansi c ,即c89,可能会抱怨它。正确的做法取决于您的申请。如果您希望它可以跨编译器移植,声明应该在语句之前。
  2. 这也是编译器和C标准的特定,因此类似于第1点的推理适用。
  3. 为此,您的代码似乎很好,但我使用的是:

    fprintf(outFile, "%d ", arr[j]);

  4. 在单行中实现类似功能。

答案 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;