argv[] 中的 Int 中断并仅打印 int

Int in argv[] breaks and just prints the int

所以我知道这是基础知识,但我不知道在哪里可以找到正确的答案。问题是我需要 运行 一个带有参数 -s 后跟一个数字的程序,告诉它从输入中跳过多少个字符,假设我们这样做(我 运行 它在 bash 中):

echo "hue" |./prog -s 2

然后应该只打印 e 而不是 shell 给我

2someone@somewhere:

此时我被困了几个小时无法弄清楚,请帮忙。

int main(int argc, char *argv[]) {
    char s;
    char input[8196];
    int i = 0;
    /* above initialized are variables needed for the root of the program to work */
    int s_num = 0; /* "-s" or skip */
    int cnt_1; /* lvl1 counter */
    /* Getting input */
    while ((s = getchar()) != EOF) {
        input[i] = s;
        printf("%d\n", i);
        i++;
    }

    /* If calling w/o arguments, the only thing that works */
    if (argc == 1) {
        //do stuff
    }

    /* Argument Check */  
    if (argc > 1) {
        printf("1\n");
        for (cnt_1 = 0; cnt_1 < argc; cnt_1++) {
            printf("2\n");

            if (strcmp(argv[cnt_1], "-s") == 1) {
                printf("3.1\n");
                int pom = cnt_1 + 1;
                int bqs = 0;
                for (int i = 0; argv[pom][i] != '[=11=]'; ++i) {
                    bqs *= 10; bqs += argv[pom][i] - '0';
                }
                s_num = bqs;
            }
            ...
if (strcmp(argv[cnt_1], "-s") == 1)

那应该是 0。strcmp returns 0 等于。

0 1 2 3 1 2 2 3.1 2

这就是我从输出中得到的结果,这是预期的结果,因为最后一个是 -s 的值。您确定您的 strcmp 正常工作吗?

第一个参数,即 argv[0] 包含可执行文件的名称。 因此,从数组 argv[1] 的第二个元素开始搜索参数,然后从那里开始。

for (cnt_1 = 1; cnt_1 < argc; cnt_1++)
//           ^  change 0 to 1 here

如果,如您在评论中所说,不允许使用 <string.h>,那么也许您可以通过 char 对包含在通过循环时 argv[] 的字符串数组:

...
if((argv[cnt_1][0] == '-') && (argv[cnt_1][1] == 's'))//argument "-s" found, handle it
{
    ... 

您的代码中存在多个问题:

  • char s; 应该是 int s; 否则循环 while ((s = getchar()) != EOF) 不能正常工作。根据 char 类型默认是有符号还是无符号,它会在 7 个字符上过早停止或无法完全匹配 EOF

  • 你在input[i] = s;之前不检查i是否小于sizeof(input)。任何足够长的输入文件都会导致缓冲区溢出。

  • 你应该使用 atoi(argv[cnt_1 + 1]) 来转换大小参数,在检查这个参数是否不同于 NULL 之后。

  • 如果您不能使用strcmp()检查参数值或atoi()转换数字,请使用指针变量并单独检查字符:

    char *p = argv[cnt_1];
    if (p[0] == '-' && p[1] == 's' && p[2] == '[=10=]') {
        int skip = 0;
        char *s = argv[cnt_1 + 1];
        if (s != NULL) {
            while (*s >= '0' && *s <= '9') {
                skip = skip * 10 + *s++ - '0';
            }
        }
    }
    
  • 最后但同样重要的是:如果你可以使用 strcmp(),你不应该对其 return 值做出超出它可以为负的事实的假设,0 或正数。您应该将 strcmp(argv[cnt_1], "-s") == 1 更改为 strcmp(argv[cnt_1], "-s") == 0 以检查字符串是否相同。它 strcmp() 是您自己的实现,如果您在评论中暗示,给它不同的语义将 非常 容易出错。而是编写一个 strequal() 函数,该函数 return 是一个布尔值,只测试 if (strequal(argv[cnt_1], "-s"))