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 をより適切に使用できると思います。これを使用して、プログラムに引数として渡されるべきであった 2 つの情報を読み取り、その後、問題のファイルを読み取るという、実際に役立つ目的で使用することを控えます。これが私の見解です:

#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

この方法でパラメーターを取り込む利点は、後でコマンドを繰り返すのが簡単になること (繰り返すために必要なすべての情報がシェルのコマンド履歴にあること) であり、プログラムにパラメーターを渡す標準的な方法であることです。また、他の用途のために標準入力を解放します。

于 2012-11-04T17:50:57.247 に答える
0

あなたのコードに見られる問題の1つは次のとおりです。

 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文字用です。ファイル名を処理したい場合は、文字列を使用する必要があります。charC では、ヌル文字で終了するの配列を使用できます。ここではargv[2]、名前を直接保持しているため、単純にポインターを使用できます。

char *fileName = argv[2];

その後:

fopen(fileName, "r");

ポインタを変更しないので、引数としてargv直接送信することもできます。argv[2]

于 2012-11-04T17:45:34.563 に答える