Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vigenere CS50-需要帮助循环使用字母_C_Cs50_Vigenere - Fatal编程技术网

Vigenere CS50-需要帮助循环使用字母

Vigenere CS50-需要帮助循环使用字母,c,cs50,vigenere,C,Cs50,Vigenere,我正试着做这件事 #包括 #包括 #包括 #包括 #包括 int main(int argc,字符串argv[]) { //检查2个命令行参数 如果(argc!=2) { printf(“不,兄弟,你必须有两个参数。\n”); 返回1; } //支票是阿尔法 否则{ 对于(int i=0;i

我正试着做这件事

#包括
#包括
#包括
#包括
#包括
int main(int argc,字符串argv[])
{
//检查2个命令行参数
如果(argc!=2)
{
printf(“不,兄弟,你必须有两个参数。\n”);
返回1;
}
//支票是阿尔法
否则{
对于(int i=0;i
根据检查结果,以下是我的错误代码:

我明白我的问题在于循环遍历每个字母,而不是将其应用于空格或符号。我尝试过使用if(isalpha)语句和else printf(“”),但它对数字或符号不起作用。我认为添加j++只会遍历alpha字符,但似乎没有帮助


这里有什么我没有的吗?

代码的基本结构看起来不错

我认为它有三个问题:

  • 所有的
    printf
    s都由
    if(isalpha(p[i]))
    检查保护,因此如果纯文本字符不是字母字符,程序将不会输出任何内容(它应该输出不变的字符)。解决方法很简单;只要在循环中删除外部
    if(…)

    for (int i = 0, j = 0, n = strlen(p); i < n; i++)
    {
        if (isupper(p[i]))
            {
            printf("%c", ((p[i] - 65) + (k[(j % cipherlen)]) - 65) % 26 + 65);
            j++;
            }
        else if (islower(p[i]))
            {
            printf("%c", ((p[i] - 97) + (k[(j % cipherlen)]) - 97) % 26 + 97);
            j++;
            }
        else
            printf ("%c", p[i]);
    }
    
    (我厌倦了重复键入相同的表达式,所以我将公共位提取到变量(
    key\u char
    key\u shift
    )。这里唯一棘手的部分是,只有在实际使用
    key\u shift
    时,
    j
    才应该递增,但您的代码已经处理了这一点。)

  • 这是一个微妙的问题,但是如果参数为负,则所有
    函数(例如
    isupper
    isalpha
    ,…)都有未定义的行为<在许多实现中,code>char
    是有符号类型,因此随机字符
    str[i]
    很可能是负数。为了完全可移植且正确,您应该在每次此类调用中将字符强制转换为
    (unsigned char)

    if (isupper((unsigned char)key_char))
        ...
    if (isupper((unsigned char)p[i]))
        ...
    else if (islower((unsigned char)p[i]))
        ...
    
    或者,完全接受ASCII(代码的其余部分假定它已经存在),并执行以下操作:


    如果(key_char>='A'&&key_char='A'&&p[i]='A'&&p[i]“string”似乎是“char*”类型,那么它可能是可以的…@melpomene它应该适用于ascii代码@LeoH您应该使用
    isprint()
    而不是
    isalpha()
    来输出
    “$!
    等等。哇。非常感谢。你完全帮助我从一个新的角度看待事物。但问题是-我们有什么理由使用key\u shift=key\u char-'a'而不是说tolower()?
    for (int i = 0, j = 0, n = strlen(p); i < n; i++)
    {
        char key_char = k[j % cipherlen];
        int key_shift;
        if (isupper(key_char)) {
            key_shift = key_char - 'A';
        } else {
            key_shift = key_char - 'a';
        }
        if (isupper(p[i]))
            {
            printf("%c", ((p[i] - 'A') + key_shift) % 26 + 'A');
            j++;
            }
        else if (islower(p[i]))
            {
            printf("%c", ((p[i] - 'a') + key_shift) % 26 + 'a');
            j++;
            }
        else
            printf ("%c", p[i]);
    }
    
    if (isupper((unsigned char)key_char))
        ...
    if (isupper((unsigned char)p[i]))
        ...
    else if (islower((unsigned char)p[i]))
        ...
    
    if (key_char >= 'A' && key_char <= 'Z')
        ...
    if (p[i] >= 'A' && p[i] <= 'Z')
        ...
    else if (p[i] >= 'a' && p[i] <= 'z')
        ...