卡在 Vigenere 中加密程序的最后一部分

Posted

技术标签:

【中文标题】卡在 Vigenere 中加密程序的最后一部分【英文标题】:Got stuck in the final part of a program for encryption in Vigenere 【发布时间】:2016-07-12 14:26:00 【问题描述】:

我正在参加 Edx 上的在线课程 cs50,我有一个任务,我必须在其中创建一个程序,用户输入一个关键字(然后用于加密)和一个需要在 Vigenere cipher 中加密的字符串.

Vigenere 的工作原理是加密关键字后面的文本:例如,如果我的字符串是“Hello”,而我的关键字是“abc”:a 等于字母字符中的 0,b 等于 1,@987654324 @ 到 2;所以字符串中的字母h被加密而不切换字符(关键字中的s字母a=0),字母e被切换一个位置并被加密为f,以此类推。如果关键字的长度小于字符串的长度(就像在这种情况下),加密必须再次使用关键字的第一个字符,这是我的问题。

事实上,我认为我很好地实现了整个程序,但我不确定如何考虑关键字的字符数是否少于输入的字符串。 该程序现在只返回加密字符串的第一个字符和未加密的第一个字符,然后它停止。我不要求一个完整的解决方案,但我只想了解如何解决我的问题程序问题。

这是我的程序:

#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

int vigenere_low( char c )

    int v = c - 'a';
    return v;


int vigenere_up( char c )

    int v = c - 'A';
    return v;


int keyword_low( char c )

    int k = c - 'a';
    return k;


int keyword_up( char c )

    int k = c - 'A';
    return k;



int main( int argc, string argv[] )

    string p;
    string keyword = argv[1];

    if ( argc != 2 )
    
        printf("Usage: ./vigenere keyword\n");
        return 1;
    

    for ( int i = 0, n = strlen(keyword); i < n; i++ )
    
        if ( !isalpha( keyword[i]) )
        
            printf("Usage: ./vigenere keyword(alphabetical) \n");
            return 1;
        
    

    p = GetString();
    int j = 0;


    for ( int i = 0, n = strlen( p ); i < n; i++ ) 
    

        if ( isalpha( p[i]) )
            


              if ( islower( p[i]) )
               
                 if ( islower( keyword[j]) )
                  
                    int a = (( vigenere_low( p[i]) + keyword_low( keyword[j]) ) % 26 ) + 'a';
                    printf("%c", a);
                    j++;
                  
                  else
                  
                    int a = (( vigenere_low( p[i]) + keyword_up( keyword[j]) ) % 26 ) + 'a';
                    printf("%c", a);;
                    j++;
                  

                
               if ( isupper( p[i]) )
                
                 if ( islower( keyword[j]) )
                   
                     int a = (( vigenere_up( p[i]) + keyword_low( keyword[j]) ) % 26 ) + 'A';
                     printf("%c", a);
                     j++;
                   
                 else
                   
                    int a = (( vigenere_up( p[i]) + keyword_up( keyword[j]) ) % 26 ) + 'A';
                    printf("%c", a);
                    j++;
                   

                
        else
        
            printf("%c", p[i] );
        



    

    return 0;
    

【问题讨论】:

我注意到的第一件事是字符串关键字 = argv[1];。稍后您调用 n = strlen(keyword) (始终为 1),并且在循环检查关键字 [j] 中有一堆 if 语句。您不应该将整个字符串存储在关键字中吗? @Shawn S string 可能是char *。为什么n = strlen(keyword) 总是 1? 发布GetString()的定义。这不是标准功能。 提示:查找 % 运算符。 @chux,GetStringcs50.h中包含的一个函数(类似于getline 【参考方案1】:

...不确定如何考虑关键字的字符数是否少于输入的字符串。

keyword[] 末尾之外访问keyword[j] 是不好的。 (未定义的行为)。当密钥比消息的 alpha 部分短时,OP 的代码会发生这种情况。

只需根据需要重复使用 keyword[] 字符串。提示:重置j

鼠标悬停回答。

int j_length = strlen(关键字); ... j++; 如果 (j >= j_length) j = 0;

【讨论】:

以上是关于卡在 Vigenere 中加密程序的最后一部分的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Vigenere 密码只能正确加密部分消息?

我的 Vigenere 加密程序中的分段错误

使用 vigenere 密码加密时出现奇怪的错误

加密 Vigenere 密码

Vigenere 加密

C 编程 - 尝试制作 Vigenere 加密/解密程序 [关闭]