【发布时间】:2020-06-08 12:54:29
【问题描述】:
我有一个关于如何在我的代码中使用星号的问题。
最初我运行!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);
}
【问题讨论】:
-
非常类似于问题here(以及我在那里给出的答案)。
-
argv[1]是一个指针(被不属于标准 c 的“字符串”类型所掩盖),所以*argv[1]是一个指针间接寻址,第二个命令行的第一个字节程序运行时传递给程序的参数。 -
@AdrianMole,谢谢我阅读了你的解释。假设我的 argv[1] = 你好,当我输入
*argv[1]时,这意味着它将取消引用字符串到 argv[1][0]、argv[1][1]...argv[1][4] ? -
*argv[1]将是argv[1][0]处的单个字符。对于字符串中的第二个字符,即argv[1][1],您可以使用*(argv[1] + 1),但在这种情况下,只使用两个[a][b]格式会更清楚。
标签: c pointers c-strings cs50 dereference