0

我有一个从命令行获取参数的 C 程序。以相反的顺序打印参数。并在大海捞针中找到针/子串。我有以下代码:

哑巴

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

#include "Dumb.h"

int main(int argc, char **argv)
{
    int i, j, flag = 0;
    for (i = 1; i < argc; i++)
    {
        char needle[] = "dumb";
        int length = strlen(argv[i]);

        for (j = length - 1; j >= 0; j--)
        {
            printf("%c", argv[i][j]);
            argv[i][j] = tolower(argv[i][j]);
        }

        char *pch = strstr(argv[i], echo);
        if(pch)
        {
            flag = 1;
        }
    }

    if (flag == 1)
    {
        printf("Dumb was found!\n");
    }

    return 0;
}

当我尝试使用以下命令从命令行手动运行它时,它可以完美运行:./a.out Dumb

但是当我尝试为它使用一个特殊的测试用例时,它只会在这一行崩溃:argv[i][j] = tolower(argv[i][j]);

这是测试的代码:

测试启动器.c

int unit_test(int argc, char **argv);

int main(int argc, char **argv)
{
    unit_test(argc, argv);
    return 0;
}

测试.c

int __hide_main__(int argc, char **argv);

int unit_test(void)
{
    int retval;
    char **array;
    array = malloc(sizeof(char *) * 2);
    array[0] = "./a.out";
    array[1] = "Dumb";

    retval = __hide_main__(2, array);

    free(array);
    return retval;
}
4

2 回答 2

0

当您使用字符串文字“Dumb”时,它是只读的,与命令行参数不同。要看到这一点,请尝试运行以下命令,您应该会收到相同的错误:

char *arr = "Dumb";
arr[0] = 'd';

要解决此问题,您应该将 argv 的值复制到一个新数组中,而不是就地修改它。

于 2018-01-21T06:46:35.217 回答
0

But when I try to use a special test case for it, it just crashes at this line: argv[i][j] = tolower(argv[i][j]);

当您尝试修改字符串文字时,您的程序具有未定义的行为。当程序具有未定义的行为时,任何事情都可能发生,就像它可以按预期工作一样,它可能会崩溃等。

改变这个:

array[1] = "Dumb";

对此:

array[1] = strdup("Dumb");

It works perfectly when I try to run it manually from command line using: ./a.out Dumb.

来自 C 标准(5.1.2.2.1p2):

参数 argc 和 argv 以及 argv 数组指向的字符串应该可以被程序修改,并在程序启动和程序终止之间保留它们最后存储的值。

因此,从命令行运行时修改包含传递的参数列表(包括程序名称)的参数向量是完全可以的。

因此,从命令行运行时程序运行良好。

此外,在您的程序unit_test函数中声明为:

int unit_test(int argc, char **argv);

但在定义中签名不匹配:

int unit_test(void)

编译器必须为此提供冲突类型错误,否则我认为这是一个错字,而您在发布之前编辑了程序。


遵循良好的编程习惯,始终检查malloc返回:

array = malloc(sizeof(char *) * 2);
if (NULL == array) {
    fprintf (stderr, "Failed to allocate memory");
    exit(EXIT_FAILURE);
}
于 2018-01-21T06:51:41.773 回答