【问题标题】:Any reason why my --help info won't print when it's my argv[1]? Any advice is appreciated当我的 argv [1] 时我的 --help 信息不会打印的任何原因?任何建议表示赞赏
【发布时间】:2019-09-10 09:40:17
【问题描述】:

如果用户为 argv[1] 输入 --help 语句,我将无法打印它。对于我可能做错的事情,任何人都可以提供任何建议吗?感谢您提供的任何帮助。

我有 strcmp 函数来逐个字符比较两个字符串,看看第一个参数是 --help 还是其他。

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

void help_info(char * info);
void numarg_error_message(char * info2);
int strcmp(const char *string, const char *string2);

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

    char *helping;
    char *helping1;
    int i, c;
    int num_sum = 0;

    for (i = 0; i < argc ; i++)
    {
        printf("%s ", argv[i]);
        //c = atoi(argv[i]);
        //num_sum += c;
    }
    if (argc < 2)
    {
        numarg_error_message(helping1);
    }
    else if (strcmp(argv[1], "--help") == 0)
    {
        help_info(helping);
        }

    else
    {
    printf("Hi");
    }

    return 0;
    }

    void help_info(char* help)
    {

    printf("Usage: p2\n\n");

    printf("p2 --help\n");
    printf("\tdisplay thus usage material.\n\n");
    printf("p2 <1> [<0> <1> ...]\n");
    printf("\t calculate the sum, minimum, maximum and mean of the real\n");
    printf("\t number arguments. Non-numeric values will be echoed to\n");
    printf("\t stdout, one per line, with the numeric results printed\n");
    printf("\t following the non-numeric lines.\n\n");

    }

    void numarg_error_message(char *errormessage)
    {
    char *help3;

    printf("Error: not enough arguments.\n");
    help_info(help3);

    }

        int strcmp(const char * str1, const char * str2) //comparing two strings
    {
    const char *cmp1 = str1;
    const char *cmp2 = str2;

    while (*cmp1 == *cmp2)
    {

        cmp1++;
        cmp2++;
    }

    return (*cmp1 - *cmp2);
}

当我输入 --help 作为我的 argv[1] 时,预期的输出应该是 help_info 函数中的信息。我得到的输出每次都是“程序名称--help Hi”。任何建议表示赞赏!

【问题讨论】:

  • @user3121023 此外,除非代码被编译为独立的,否则具有与标准库函数同名的函数是未定义的行为。

标签: c command-line-arguments strcmp


【解决方案1】:

不要实现你自己的strcmp;这是未定义的行为,很可能比标准 C 库实现的要慢。

话虽如此,strcmp 内的while 循环的控制条件是错误的。它不会在字符串末尾的终止空字符处停止。

要解决这个问题,请执行以下操作:

while (*cmp1 && *cmp1 == *cmp2)

而不是这个:

while (*cmp1 == *cmp2)

为了解决未定义的行为,您可以将函数命名为 compare_string 或类似名称(只要名称不以 str 开头),然后将 strcmp 的用法更改为该名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2021-08-06
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多