如何拒绝字母数字的命令行参数(即../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
允许您将字符串转换为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;
}