Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何拒绝字母数字的命令行参数(即../main 20x),而不是单独的数字参数(即../main 20)?(C)中_C_Command Line Arguments_Cs50 - Fatal编程技术网

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

如何拒绝字母数字的命令行参数(即../main 20x),而不是单独的数字参数(即../main 20)?(C)中,c,command-line-arguments,cs50,C,Command Line Arguments,Cs50,我已经想出了如何拒绝纯粹按字母顺序排列的论点。我不知道如何在传递数字输入时拒绝字母数字用户输入 这是我的相关代码: #include <cs50.h> #include <stdio.h> #include <string.h> #include <ctype.h> int main(int argc, string argv[]) { if (argc != 2 || isalpha(*argv[1])) {

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

这是我的相关代码:

#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...
#包括
#包括
#包括
#包括
int main(int argc,字符串argv[])
{
如果(argc!=2 | | isalpha(*argv[1]))
{
printf(“用法:./caesar key\n”);
返回1;
}
其他的
我的代码继续成功地实现了我程序的功能(除了这个bug)


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

你快到了:你的代码检查
*argv[1]
(即该参数的第一个字符)是字母字符。相反,让我们使用循环检查整个
argv[1]
字符串。我们还将使用
isdigit
,这样我们可以拒绝使用
isalpha
无法检测到的字符串,例如
41!@4

argv
是一个
char*
数组,或指向字符的指针,意思是
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;
}
请注意,我给出的代码有一些限制:

  • 它不会检查数字是否太大,例如,无法放入
    int
  • 它不处理十进制值(即那些我们将解析为双精度的值)
  • 它不允许负数
  • 使用strtol的备选方案: 库函数
    strtol
    允许您将字符串转换为
    long int
    ,同时还提供指向无法转换的第一个字符的指针

    您可以检查该指针:如果它指向一个空字符(即
    *endptr=='\0'
    ),则
    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 != '\0') {
       printf("Key must be numeric and fit into a long\n");
       return 1;
    }
    

    关于<代码> int iSalnUm(int x);。请将字符串解析成整数,对吗?为什么不使用一个配方?可能有一个副本可以考虑使用<代码> Strutter()或类似内容,以查看字符串是否为整数。您可以检查转换后的文本的结尾和对象,如果转换完成后有不需要的字符。@JonathanLeffler我的目的是对OP的现有方法进行迭代,这将在教学上提供信息。我将使用基于库的方法进行更新当你不在移动设备上时。谢谢,这很管用。从其他人的回答来看,我猜你的解释中有冗余,尽管从教学的角度来说确实有帮助。使用strtol()是更优雅/简洁的解决方案吗@JonathanLeffler@dayvista我同意
    strtol
    是有意义的。我现在正在写一个更新注意
    strtol
    还需要以一种不寻常的方式检查
    errno
    ;有关详细信息,请参阅。如果您想要的类型不太长,您需要自己进行边界检查欧沃德。
    if (argc != 2)
    {
       printf("Usage: ./caesar key\n");
       return 1;
    }
    char* endptr;
    long key = strtol(argv[1], &endptr, 10); // 10 meaning decimal
    if(*endptr != '\0') {
       printf("Key must be numeric and fit into a long\n");
       return 1;
    }