【问题标题】:argv[2] value not passing properly from cmdargv[2] 值未从 cmd 正确传递
【发布时间】:2013-08-31 10:33:26
【问题描述】:

这段代码有问题:

#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 都灵

【问题讨论】:

  • if(argc != 2) { fprintf(stderr ,"Errore nella linea di comando: %d\n", argc); exit (EXIT_FAILURE); } .. 天很黑,我们戴着墨镜...`
  • 您需要在调试器中运行您的程序。它会在程序崩溃时停止,并让您查看并遍历函数调用堆栈,以便您可以找到代码中发生崩溃的位置。在调试器中,您还可以检查变量并查看它们的值。
  • 您必须将 argv[2] 更改为 argv[1] 这是唯一的问题,此错误在您的代码中出现两次
  • 好的,我现在试试 :) 谢谢。
  • 检查fscanf 是否正常工作。使用printf 查看destinazione 的值。

标签: c main argv


【解决方案1】:

请记住,argcargv 数组中的条目数,因此如果 argc2,那么您在 argv 数组中只有索引 01。如果你要使用argv[2],那么argc 必须是3

argv[argc]始终NULL

【讨论】:

  • 你的意思是argv[argc]!! :-)
  • @nishant 是的,确实如此! :)
  • 是的,我回来告诉我我注意到了这个错误,我改变了它,但它仍然给我错误:S
  • @user2425899 如果仍然是同样的错误,那么您应该使用此信息更新问题(并且您可能还希望在调试器中运行您的程序)。如果这是另一个问题,那么您可能会发布一个新问题。
  • 嗯,改了之后会怎样?你原来的错误应该已经修复了吧?
【解决方案2】:

添加到 Joachim Pileborg(正如他已经在我之前发布的那样)

请记住,在 C 中索引从 0 开始,因此 argv[2] 是程序名称之后的第二个字符串,即如果您执行以下语句:

prog_name arg1 arg2

然后

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

另外发布你的命令行语句你用来执行程序

【讨论】:

  • C:\Users\HP G6\Desktop\Fasdb\bin\Debug>fasdb.exe 都灵
  • @user2425899 :将其添加到您的问题陈述中!是的,你做错了,请参阅 Joachim Pileborg 或我的解释仔细
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2014-08-12
  • 2013-10-19
  • 1970-01-01
相关资源
最近更新 更多