为什么我的循环在 C 中的第一个参数(argv 的字符)处停止?

Why is my loop stopping at the first argument (char of argv) in C?

我不明白为什么我的代码在命令行参数的第一个字符处停止。 我认为问题出在循环中,我需要它来检查命令行参数是否为数字,因此第一部分和第二部分并不重要。 谢谢,抱歉打扰了,我是新手。

int main(int argc, string argv[])
{
    // checking if there is more than one command-line argument
 
    if (argc != 2)
    {
        printf("Usage: ./caesar key\n");
        return 1;
    } 
    else 
    {
       // checking if command-line argument is a number
      for (int i = 0, n = strlen(argv[1]); i < n; i++)
      {
          printf("%c\n", argv[1][i]);
          if (isdigit(argv[1][i])) 
          {
              return 0;
          }
          else 
          {
              printf("Usage: ./caesar key\n");
              return 1;
          }
          
      }
      
      
    }
        

    
} 

您正在 有效 案例中执行 return,因此您 检查 argv[1].

的第一个 个字符

您想在有效情况下终止循环,累积值。

这是一些重构代码:

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

// so we don't have to include cs50.h ...
typedef char *string;

int
main(int argc, string argv[])
{

    // checking if there is more than one command-line argument
    if (argc != 2) {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    // checking if command-line argument is a number
    int keyval = 0;
    for (char *cp = argv[1];  *cp != 0;  ++cp) {
        if (! isdigit(*cp)) {
            printf("Usage: ./caesar key\n");
            return 1;
        }

        // accumulate the number as we go along, digit-by-digit
        keyval *= 10;
        keyval += (*cp - '0');
    }

    printf("keyval=%d\n",keyval);

    return 0;
}

这是另一种方法:

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

// so we don't have to include cs50.h ...
typedef char *string;

int
main(int argc, string argv[])
{

    // checking if there is more than one command-line argument
    if (argc != 2) {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    // checking if command-line argument is a number
    for (char *cp = argv[1];  *cp != 0;  ++cp) {
        if (! isdigit(*cp)) {
            printf("Usage: ./caesar key\n");
            return 1;
        }
    }

    // we can use a standard function to get the value
    int keyval = atoi(argv[1]);
    printf("keyval=%d\n",keyval);

    return 0;
}

这是另一种方式:

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

// so we don't have to include cs50.h ...
typedef char *string;

int
main(int argc, string argv[])
{

    // checking if there is more than one command-line argument
    if (argc != 2) {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    // checking if command-line argument is a number
    char *cp;
    int keyval = strtol(argv[1],&cp,10);

    // invalid digit found
    if (*cp != 0) {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    printf("keyval=%d\n",keyval);

    return 0;
}

请注意,strtol 将接受 负数 值(例如 -37)作为有效值。因此,如果负值不可接受,我们需要额外检查 [就在 valid printf]:

之前
// negative value found
if (keyval < 0) {
    printf("Usage: ./caesar key\n");
    return 1;
}