如何正确格式化命令行参数?

How does one correctly format command line arguments?

我正在尝试构建一个简单的程序来熟悉命令行功能,我的格式似乎不正确,但我发现很难准确理解生成的错误消息的含义。我的意图是创建一个程序来检查命令行中的所有字符是否都是数字。这是我的代码:

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

int main(int argc, char *argv[])
{  
    for (int i = 0; i < strlen(argv); i++)
    {
        if (!isalnum(argv[i]))
        {
            printf("Please provide letters or numbers only");
        }
        else
        {
            printf("Success!");
        }
    }
}

我在尝试编译时收到的错误消息是:c:9:32: error: incompatible pointer types passing 'char **' to parameter of type 'const char *'; dereference with * [-Werror,-Wincompatible-pointer-types]

argv 是指向字符串的指针的数组(指针)。

isalnum 正在检查一个字符,而不是整个字符串,因此您将需要两个循环:检查每个字符串和检查字符串中的每个字符。

此代码不会收到警告:

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

int main(int argc, char *argv[])
{  
    for (int c = 1; c < argc; c++) // loop for checking each strings
    {
        for (int i = 0; i < strlen(argv[c]); i++) // loop for checking each characters in the strings
        {
            if (!isalnum(argv[c][i]))
            {
                printf("Please provide letters or numbers only");
            }
            else
            {
                printf("Success!");
            }
        }
    }
}

但您可能希望这段代码经过改进:

  • 只打印一次消息而不是每个字符。
  • 使用size_t循环直到字符串的长度。
  • 在循环之前调用 strlen() 一次,而不是在每次迭代中调用。
  • 使用 puts 而不是 printf 在输出末尾打印换行符。
  • 添加return 0; 澄清代码returns 0.
  • 删除不必要的 #include,包括非标准的。
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
    int all_ok = 1;
    for (int c = 1; c < argc; c++)
    {
        size_t len = strlen(argv[c]);
        for (size_t i = 0; i < len; i++)
        {
            all_ok = all_ok && isalnum(argv[c][i]);
        }
    }
    if (!all_ok)
    {
        puts("Please provide letters or numbers only");
    }
    else
    {
        puts("Success!");
    }
    return 0;
}