如何拒绝字母数字命令行参数(即 ./main 20x),而不是纯数字参数(即 ./main 20)? (在 C 中)

How can I reject an alphanumeric command-line argument (i.e. ./main 20x), but not a solely numeric one (i.e. ./main 20)? (in C)

我想出了如何拒绝纯字母顺序的论点。我不知道如何在传递数字输入时拒绝字母数字用户输入。

这是我的相关代码:

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

int main(int argc, string argv[])
{
    if (argc != 2 || isalpha(*argv[1]))
        {
            printf("Usage: ./caesar key\n");
            return 1;
        }
    else...

我的代码继续成功执行我的程序的功能(除了这个错误)。

如有任何帮助,我们将不胜感激!这是一个 edX cs50 家庭作业。除了这个错误,我完成了整个作业。我搜索了 3 个多小时的答案,但无济于事。帮助我,stack overflownobi。你是我唯一的希望。

您快完成了:您的代码检查 *argv[1](即该参数的第一个字符)是否为字母字符。相反,让我们使用循环来检查整个 argv[1] 字符串。我们还将使用 isdigit 来代替,这样我们就可以拒绝使用 isalpha.

无法检测到的字符串,例如 41!@4

argvchar* 的数组,或指向字符的指针,这意味着 argv[1] 是指向该参数第一个字符的指针。给定一个指向字符串第一个字符的指针,我们需要使用 strlen 找到字符串的长度,然后我们可以编写一个循环。让我们把它分解成一个函数:

bool string_is_numeric(char* string) {
    size_t length = strlen(string);
    for(size_t i = 0; i < length; i++) {
        if(!isdigit(string[i])) { return false; }
    }
    return true;
}

您可以这样调用:

if (argc != 2 || !string_is_numeric(*argv[1]))
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }

请注意,我提供的代码有一些限制:

  1. 它不检查数字是否太大,例如适合 int.
  2. 它不处理十进制值(即我们将解析为 double 的值)。
  3. 不允许负数。

替代使用strtol

库函数 strtol 允许您将字符串转换为 long int,同时还为您提供指向无法转换的第一个字符的指针。

您可以检查该指针:如果它指向空字符(即 *endptr == '[=27=]'),则 strtol 成功到达字符串末尾,这意味着它是所有有效数字。

您需要声明一个 long 和一个 char* 来保存结果:

if (argc != 2)
{
   printf("Usage: ./caesar key\n");
   return 1;
}
char* endptr;
long key = strtol(argv[1], &endptr, 10); // 10 meaning decimal
if(*endptr != '[=12=]') {
   printf("Key must be numeric and fit into a long\n");
   return 1;
}