【问题标题】:Accepting main arguments接受主要论点
【发布时间】:2014-12-07 05:53:38
【问题描述】:

我正在编写一个随机数生成器,我希望在程序内部和外部获取输入。我在主要论点上遇到了麻烦。这是我的代码(对不起,有点草率,但我只有 15 岁) 我的问题出在 main 函数中...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int min;
int max;
int howMany;
int in;
int rnd();
void menu();
void getMin();
void getMax();
void getHowMany();
void getNumbers();
void quickRandTut();
void quickRand();
int main(int argc, char **argv[]){
    int i;
    int x;
    srand(time(NULL));
    if(argc > 1){
        for(i = 0; i != argc; i++){
            x = i + 1;
            if(argv[i] == "-min") min = argv[x];
            else if(argv[i] == "-max") max = argv[x];
            else if(argv[i] == "-count") howMany = argv[x];
        }
        quickRand();
    }
    else if(argc == 1) menu();
    return 0;
}
void menu(){
    while(1){
        system("clear");
        printf("[1]Set Min.\n[2]Set Max.\n[3]Set How Many\n[4]Get Numbers\n[5]Quick Rand\n[6]Exit\n\nWhat would you like to do?\n>>>");
        scanf("%d", &in);
        if(in == 1) getMin();
        else if(in == 2) getMax();
        else if(in == 3) getHowMany();
        else if(in == 4) getNumbers();
        else if(in == 5) quickRandTut();
        else if(in == 6) exit(0);
    }
}
void getMin(){
    int cont = 0;
    while(cont == 0){
        system("clear");
        printf("What is the smallest number you want?\n>>>");
        scanf("%d", &min);
        if(min < 1){
            system("clear");
            printf("Your minimum must be at least 1...\n");
            sleep(3);
        }
        else if(min > 0) cont = 1;
    }
}
void getMax(){
    int cont = 0;
    while(cont == 0){
        system("clear");
        printf("What is the largest number you want?\n>>>");
        scanf("%d", &max);
        if(max < 1){
            system("clear");
            printf("Your maximum must be at least 1...\n");
            sleep(3);
        }
        else if(max > 0) cont = 1;
    }
}
void getHowMany(){
    int cont = 0;
    while(cont == 0){
        system("clear");
        printf("How many numbers would you like?\n>>>");
        scanf("%d", &howMany);
        if(howMany < 1){
            system("clear");
            printf("You must get at least 1 number...\n");
            sleep(3);
        }
        else if(howMany > 0) cont = 1;
    }
}
void getNumbers(){
    int i;
    int col = 0;
    int num;
    system("clear");
    if(max < min){
        system("clear");
        printf("Your maximum must be larger than you minimum...\n");
        sleep(3);
        menu();
    }
    else if(max > min){
        for(i = 0; i != howMany; i++){
            col++;
            num = rnd(min, max);
            printf("%d. %d\n", col, num);
        }
        printf("\n\n[1]Continue\n>>>");
        scanf("%d", &in);
        menu();
    }
}
int rnd(int min, int max){
    return ((rand() % (max - min)) + min);
}
void quickRandTut(){
    system("clear");
    printf("You can use DSP's Random Number Generator by giving it external arguments.\n");
    printf("You need to give it 3 arguments:\n\t-min #\n\t-max #\n\t-count #\n");
    printf("\nHere is an example input and output:\n\nInput:\n\t/RAND -min 1 -max 10 -count 3\nOutput\n\t1. 3\n\t2. 9\n\t3. 4\n");
    printf("\n-min #, -max #, and -count # arguments must be given in that order.\n\n[1]Menu\n>>>");
    scanf("%d", &in);
    menu();
}

void quickRand(){
    int col;
    int i;
    int num;
    system("clear");
    for(i = 0; i != howMany; i++){  
        num = rnd(min, max);
        printf("%d. %d\n", col, num);
    }
}

当我编译它时,它告诉我:

rand.c: In function ‘main’:
rand.c:23:15: warning: comparison of distinct pointer types lacks a cast [enabled by default]
rand.c:23:30: warning: assignment makes integer from pointer without a cast [enabled by default]
rand.c:24:20: warning: comparison of distinct pointer types lacks a cast [enabled by default]
rand.c:24:35: warning: assignment makes integer from pointer without a cast [enabled by default]
rand.c:25:20: warning: comparison of distinct pointer types lacks a cast [enabled by default]
rand.c:25:41: warning: assignment makes integer from pointer without a cast [enabled by default]

当我运行它时,我给它以下参数:

/RAND -min 1 -max 100 -count 10

虽然它没有做任何事情。请尽你所能提供帮助。

【问题讨论】:

  • 尝试将字符 **argv[] 更改为 char *argv[]
  • 那应该是main(int argc, char *argv[])只有一个*,而不是两个。
  • 可能是两个* 没有[] main(int argc, char **argv)
  • 只解决了一半的问题。仍然说从没有演员表的指针制作一个 intiger
  • 你不能在 C 中比较字符串。:)

标签: c random command-line-arguments


【解决方案1】:

如另一个答案中所述,将char **argv 更改为char *argv[],这样可以解决一件事。

存在其他错误是因为您平等地对待字符串和整数。您不能在 C 中使用 &gt;, &lt;, &gt;=, &lt;=, == 运算符比较它们,而是使用字符串函数(在本例中为 strncmp())。赋值也是如此,不能将字符串赋值给 int,需要对其进行转换,尝试sscanf()atoi() 或任何其他类似函数。

【讨论】:

  • 很可能两者都没有,像往常一样;)
  • 难怪他的个人资料有 18 次浏览。所有回答过他问题的人
【解决方案2】:

尝试将char **argv[] 更改为字符*argv[]

然后在出现错误的任何地方将 argv[x]; 更改为 *argv[x];

那是

if(argv[i] == "-min") min = *argv[x];
else if(argv[i] == "-max") max = *argv[x];
else if(argv[i] == "-count") howMany = *argv[x];

这是为了消除错误

【讨论】:

  • rand.c 在函数'main'中:rand.c:23:15:警告:不同指针类型的比较缺少强制转换[默认启用] rand.c:23:30:警告:赋值从没有强制转换的指针生成整数 [默认启用] rand.c:24:20:警告:不同指针类型的比较缺少强制转换 [默认启用] rand.c:24:35:警告:赋值从没有强制转换的指针 [默认启用] rand.c:25:20:警告:不同指针类型的比较缺少强制转换[默认启用] rand.c:25:41:警告:赋值从没有强制转换的指针生成整数[默认启用]
  • @DarkSun 看看 user3121023 的评论。
  • @DarkSun 我的回答会帮你摆脱Syntax Errors,凯尔姆的回答会帮你摆脱Logical Errors
  • @BhargavRao 我们是一个很棒的团队,不是吗?
  • @Kelm 这是 Stack Overflow 的主要精髓。
【解决方案3】:

哇,这里有很多问题。清理一些东西会有很大帮助:

包含sleep 所需的标头:

#include <unistd.h>

修复不完整的原型:

int rnd(int, int);  /* was an incomplete prototype */

main() is a mess 您需要使用atoistrtol 将参数值转换为数值,并且您的循环在编写时是不安全的。以下是它似乎需要的更改:

int main(int argc, char **argv){
    int i;
    // int x;
    srand(time(NULL));
    if(argc > 2){
        for(i = 2; i < argc; i++){
            // x = i + 1;
            if ( strcmp (argv[i - 1], "-min") == 0 ) min = atoi (argv[i]);
            else if (strcmp (argv[i - 1], "-max") == 0 ) max = atoi (argv[i]);
            else if (strcmp (argv[i - 1], "-count") == 0 ) howMany = atoi (argv[i]);
        }
        quickRand();
    }
    else if(argc == 1) menu();
    return 0;
}

我不知道col 应该在quickRand() 中是什么,但您至少需要在尝试打印之前将其初始化。

通过这些更改,您的代码将在没有进一步警告的情况下编译。两个rules 会有所帮助。 (1) 始终初始化您的变量,并且(2) 始终在编译时启用警告,(-Wall -Wextra ) 最低限度。当您遇到其他障碍时发表评论。

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 2020-11-28
    • 2011-03-26
    • 2014-08-06
    • 2021-08-04
    • 2011-03-08
    • 2019-01-31
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多