[最初,我运行!isdigit(argv[1])
[没有*
],它显示了分段错误。在参考在线解决方案之后,我意识到我们应该将*
放在!isdigit(*argv[1])
中。有人可以在代码中解释*
的功能吗?下面是我的代码:
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, string argv[])
{
if (argc !=2 || !isdigit(argv[1]))
{
printf("Usage: ./caesar key\n");
return 1;
}
int key = atoi(argv[1]);
string p = get_string("plaintext: ");
printf ("ciphertext: ");
for ( int i=0, x=strlen(p); i<x; i++)
{
if (p[i]>='a' && p[i]<='z')
{
p[i] = (p[i] -'a'+key ) %26 +'a';
}
if (p[i]>='A' && p[i]<='Z')
{
p[i] = (p[i] -'A'+key ) %26 +'A';
}
}
printf("%s\n",p);
}
string argv[]
名称string
是类型char *
的别名。所以参数声明可以像这样重写
char * argv[]
即它是char *
类型的指针数组。编译器将该声明隐式调整为char **argv
。因此,表达式
argv[1]
给出了传递给索引为1的函数主数组的第二个元素。它的类型为char *
。函数isdigit期望将char
类型的对象转换为unsigned char
类型。因此,要获取类型为char
(指向的字符串的第一个字符)的对象,您必须取消引用类型为argv[1]
的指针char *
,例如* argv [1]或argv[1][0]
。至少写成这样会更正确
!isdigit( ( unsigned char )*argv[1] )
但是总的来说,此检查还不够。您应该检查指针argv[1]
指向的整个字符串是否代表数字。