1
  1. 在这个程序中,我想让用户输入 2 个参数,整数个数和文件名。

    1. 该文件有 10 行整数值。
    2. 读取文件,并将其放入 inArray[];
    3. 然后将其作为结尾输出;

      笔记:对于完整的程序,我想制作一个程序,它将扫描由随机整数组成的文件,然后按升序对它们进行排序,并打印出排序整数的前 10%。

      错误:现在,我想测试它是否可以读取文件并将值正确放入 inArray,但它不断出错。

        warning: initialization makes integer from pointer without a cast
         findTotal.c:43:6: warning: passing argument 1 of ‘fopen’
                     makes pointer from integer without a cast
        /usr/include/stdio.h:271:14: note: expected ‘const 
         char * __restrict__’ but argument is of type ‘char’
      

请帮我解决这个问题,谢谢

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(int argc, char *argv[]){

 int numOfInt;
 char fileName="";

 sscanf(argv[1],"%d",&numOfInt);
 sscanf(argv[2],"%c",&fileName);

 int i, rc;

 /* the origninal list , initialise as 0 index*/
 int inArray[numOfInt];

 /* the number of output int  */
 int outNumInt = numOfInt * 0.1;

 /*  the output array of int  */
 int outArray[outNumInt];


 FILE *inFile;
 inFile = fopen(fileName,"r");

 /*      check if the file is empty      */
 if(inFile==NULL){
    printf("can not open the file");
 }

 for (i = 0; (rc = getc(inFile)) != EOF && i < numOfInt; inArray[i++] = rc) 
 { 


 }//for

 fclose(inFile);

 for(i = 0; i < numOfInt;i++){

    printf("%x\n",inArray[i]);
 }



}//main
4

3 回答 3

1

我认为您可以在这里更好地使用 scanf 。您使用它来读取应该作为参数传递给程序的两条信息,然后避免将它用于它实际上有益的用途,即读取有问题的文件。这是我对此的看法:

#include <stdlib.h>
#include <stdio.h>
int cmp(const void *a, const void *b) { return *(int*)b - *(int*)a; }

int main(int argc, char *argv[])
{
    char * ifile = argv[1];
    int n = atoi(argv[2]), m = n/10, i;
    int nums[n];
    FILE * f = fopen(ifile, "r");
    for(i = 0; i < n; i++) fscanf(f, "%d", &nums[i]);
    qsort(nums, n, sizeof(int), cmp);
    for(i = 0; i < m; i++) printf("%d\n",nums[i]);
    return 0;
}

如果此文件是prog.c并且对应的可执行文件是prog,并且您的带有数字的文件被称为nums.txt,并且包含100整数,则可以将其称为

prog nums.txt 100

以这种方式接收参数的优点是它使以后重复命令变得更容易(重复它所需的所有信息都将在 shell 的命令历史记录中),并且它是将参数传递给程序的标准方式。它还为其他用途释放标准输入。

于 2012-11-04T17:50:57.247 回答
0

我在您的代码中看到的问题之一是:

 char fileName="";
 sscanf(argv[2],"%c",&fileName)

字符串文字是一个常量字符串,这意味着您不应该尝试修改它,您应该为该字符串使用静态(或动态)char 数组并使用%s格式说明符,或者只是将 fileName 指向 argv[2]

char *fileName;    
fileName = argv[2];
于 2012-11-04T17:45:20.257 回答
0

您确实对文件名的管理有问题。char用于字符;如果要处理文件名,则必须使用字符串。char在 C 语言中,我们可以使用一个以空字符结尾的 数组。在这里,由于argv[2]直接保存名称,您可以简单地使用指针。

char *fileName = argv[2];

接着:

fopen(fileName, "r");

由于您不修改argv指针,因此您也可以直接argv[2]作为参数发送。

于 2012-11-04T17:45:34.563 回答