使用Modulo包装文本

时间:2014-03-11 15:18:02

标签: c text cs50

我正在尝试使用字符串键来加密一些纯文本。无论如何,如果明文大于键,则键假设继续使用键。我使用模数使键重新开始但由于某种原因它不起作用...代码有什么问题?顺便说一句,关键状态上限或下限状态不是一个因素,所以这就是我将其更改为更低的原因。任何提供的帮助将不胜感激。 //按照建议清理代码。

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

int main (int argc, string argv[])

{


if (argc != 2)
{

  printf("Ouch missing key\n");

return 1;
}

//get encryption keyword from argv array
string k= (argv[1]); 

//test for non aplha character in plain text message

int x;

for (x = 0; x <strlen(argv[1]); x++)
        {

    if(isalpha(k[x]) == false)

        {
printf("Ouch ensure value is alphabetical only\n");

return 1;

        }
  }

string m;


m = GetString(); //get plain text from prompt


for (int i= 0, j = 0; i< strlen(m) && j<= strlen(k); i++, j++)


{

    if (

        isalpha(m[i]) && isupper(m[i]))

            {

                m[i]= (m[i]-'a' + (tolower(k[j % strlen(k)])-'a')) % 26 + 'A';

            } 

    else if (

        isalpha(m[i]) && islower(m[i])

        )
            { 

           m[i] = (m[i] - 'a' + (tolower(k[j %strlen(k)])- 'a')) % 26 + 'a';


            }

    else 
         m[i] = m[i];
}

printf("%s\n", m);

}

2 个答案:

答案 0 :(得分:1)

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

int main (int argc, string argv[]){
    if (argc != 2){
        printf("Ouch missing key\n");
        return 1;
    }
    string k = argv[1];
    int len_k = strlen(k);

    for (int i = 0; i < len_k; ++i){
        if(isalpha(k[i]))
            k[i] = tolower(k[i]);
        else {
            printf("Ouch ensure value is alphabetical only\n");
            return 1;
        }
    }

    string m;
    m = GetString();

    for (int i= 0; i< m[i] ; ++i){
        if(isupper(m[i]))
            m[i]= (m[i]-'A' + k[i % len_k] - 'a') % 26 + 'A';
        else if(islower(m[i]))
            m[i]= (m[i]-'a' + k[i % len_k] - 'a') % 26 + 'a';
        else 
            m[i] = m[i];//no effect, no need
    }

    printf("%s\n", m);
    free(m);
    return 0;
}

答案 1 :(得分:0)

如果您的编码语言是C修复main(),则

int main (int argc, string argv[])

int main (int argc, char * argv[])