0

このコードに問題があります:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20

int main( int argc , char * argv[])
{
int giorno , mese , anno , metri , primo_g = 31, primo_m = 12, primo_a = 3000, i = 0 ;
char tipo , destinazione [N+1] ;
float km_arrivo = 0 , costo_tot = 0 ;
FILE * fdati;

if(argc != 2) {
    fprintf(stderr ,"Errore nella linea di comando\n");
    exit (EXIT_FAILURE);
}

if ((fdati = fopen ("viaggi.dat", "r")) == NULL ) {
    fprintf(stderr ,"Errore nell'apertura del file\n");
    exit (EXIT_FAILURE);
}

while ((fscanf(fdati , "%s %d/%d/%d %d %c" , destinazione , &giorno , &mese , &anno , &metri , &tipo))!= EOF){
    if (strcmp (argv[2],destinazione) == 0 ) {
        if((tipo == 'R')||(tipo =='r')){
            i++;
            km_arrivo = km_arrivo + (float)(metri/1000) ;
            costo_tot = (i*5) + 0.10 * (km_arrivo);
        }
    }
    if ((anno<primo_a)||((anno==primo_a)&&(mese<primo_m))||((anno==primo_a)&&(mese==primo_m)&&(giorno<primo_g))){
        primo_a= anno;
        primo_m = mese;
        primo_g = giorno;
    }
}
if (fclose(fdati) != 0 ){
    fprintf(stderr , "Errore nella chiusura del file\n");
    exit(EXIT_FAILURE);
}

printf("Chilometri da %s: %.2f\n", argv[2] , km_arrivo);
printf("Data primo viaggio : %d/%d/%d\n", primo_g , primo_m , primo_a);
printf("Il costo totale dei viaggia da torino : €%.2f", costo_tot);
exit(EXIT_SUCCESS);
}

Viaggi.dat には以下が含まれます。

torino 22/01/2011 120000 A
milano 01/03/2011 80000 R
genova 03/06/2011 100000 A
bologna 01/02/2011 100000 A
torino 15/01/2011 120000 R
milano 20/01/2011 80000 R
torino 01/01/2011 80000 A
torino 22/01/2011 80000 R

問題は、cmd からプログラムを実行し、argv[2] の値 (例: "Torino") を書き込むと、プログラムが動作を停止したことが通知されることです。argv[2] の値を書き込まずにプログラムを実行すると、正常に実行され、stderr メッセージが表示されます。

前もって感謝します、

よろしく。

編集: argv[2] を argv[1] に変更しましたが、まだ同じエラーが発生しています。

次のように、 cmd から実行しています。

C:\Users\HP G6\Desktop\fasdb\bin\Debug>fasdb.exe torino

4

2 に答える 2

3

argcは配列内のエントリの数であることを忘れないでください。argvしたがって、配列内にはインデックスとインデックスしかありませargcん。あなたが使用するためには、でなければなりません。201argvargv[2]argc3

argv[argc]常になりますNULL

于 2013-08-28T11:23:27.690 に答える
0

Joachim Pileborgに追加(彼はすでに私の前に投稿したように)

C ではインデックスは 0 から始まることに注意してください。したがって、argv[2] はプログラム名の後の 2 番目の文字列です。つまり、次のステートメントを実行すると、次のようになります。

prog_name arg1 arg2

それから

argv[0] = prog_name
argv[1] = arg1
argv[2] = arg2

プログラムの実行に使用しているコマンドラインステートメントも投稿してください

于 2013-08-28T11:27:38.080 に答える