如何拒绝字母数字命令行参数(即 ./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
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;
}
您可以这样调用:
if (argc != 2 || !string_is_numeric(*argv[1]))
{
printf("Usage: ./caesar key\n");
return 1;
}
请注意,我提供的代码有一些限制:
- 它不检查数字是否太大,例如适合
int
.
- 它不处理十进制值(即我们将解析为
double
的值)。
- 不允许负数。
替代使用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;
}
我想出了如何拒绝纯字母顺序的论点。我不知道如何在传递数字输入时拒绝字母数字用户输入。
这是我的相关代码:
#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
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;
}
您可以这样调用:
if (argc != 2 || !string_is_numeric(*argv[1]))
{
printf("Usage: ./caesar key\n");
return 1;
}
请注意,我提供的代码有一些限制:
- 它不检查数字是否太大,例如适合
int
. - 它不处理十进制值(即我们将解析为
double
的值)。 - 不允许负数。
替代使用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;
}