【发布时间】:2021-08-12 20:59:50
【问题描述】:
我目前在做CS-PSET2,我写了下面的代码。
一切正常,但现在我重新阅读它,我不明白为什么。
第 11 行有疑问:if(isdigit(argv [1][i]))。
假设我写了"35",第一个字符是一个数字,所以循环是真的,它开始 --> 我必须写一个字符串(第 16 行)。
现在程序会检查第二个字符“5”,它是一个数字,是的-->理论上我必须再写一个字符串。
但为什么不呢?为什么我没有得到双倍的结果?
#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]))
{
int n = strlen(argv [1]);
for (int i=0; i<n; i++)
{
if(isdigit(argv [1][i]))
{
string plaintext = get_string("Plaintext: ");
int key = atoi(argv[1]);
int l = strlen(plaintext);
for(int p=0; p <l; p++)
if isupper(plaintext[p])
{
printf("%c", (((plaintext[p] - 'A') + key) % 26) + 'A');
}
else if islower(plaintext[p])
{
printf("%c", (((plaintext[p] - 'a') + key) % 26) + 'a');
}
else
{
printf("%c", plaintext[p]) ;
}
return 0;
}
else
{
printf("Nope\n");
return 1;
}
}
}
else
{
printf("Nope\n");
return 1;
}
}
【问题讨论】:
-
int main (int argc , string argv [])是可疑的,但如果string是char*的别名,则可以。但是isdigit(argv [1])甚至不应该编译,因为isdigit()需要int而不是char*。而int key = atoi(argv[1]);会将整个"35"转换为一个int35,这是你真正想要的吗?还是您只想转换单个数字3和5?因为atoi()不能在不将它们分别放入带有空终止符的char[2]数组的情况下做到这一点。 -
@RemyLebeau 仅供参考,
string绝对别名为char*。这是cs50.h为聚会带来的众多(非)“有用”的东西之一,最终完全让 C 的新手感到困惑。 -
您是编译为 C 还是 C++?它们是不同的语言。 C++ 语言有
std::string,定义在<string>。 C 语言只有字符数组。 -
您应该总是在
for循环之后使用大括号。它使阅读更容易,编码更容易。查看您的for (int p= 0循环。