CS50凯撒(星号的用法)[重复]

问题描述 投票:0回答:1
我有一个关于如何在代码中使用星号的问题。

[最初,我运行!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); }

c pointers c-strings dereference
1个回答
0
投票
似乎在此参数声明中

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]指向的整个字符串是否代表数字。    
© www.soinside.com 2019 - 2024. All rights reserved.