-2

我正在尝试创建一个关于 OTP(One Time Pad)加密的 C 程序。该程序从用户那里获取一个要加密的字符串。然后它必须在获取密钥之前询问密钥的长度(整数)。由于我希望程序 100% 正确,因此我对密钥的长度进行了限制。我们知道,在 OTP 中,密钥的长度必须是整数,不能超过文本的长度。那么,我们如何实现这样的过滤器呢?我已经尝试创建代码,但它不工作。

这是代码:

//An Under-Construction program to implement OTP (One time Pad) encryption     
#include "stdio.h"
#include "cstring"
#include "ctype.h"
int main()
{
    char str[10000], key[10000];
    printf("Enter the string:- ");
    scanf("%[^\n]", str); //stops scanning when user presses return

    int len /* stores the number of digits of the OTP key*/, isalphabet=0;
        do
        {
            printf("What is the length of the key you are entering?:-");
            scanf("%d", &len);

            if( isalpha(len) ) // Checks if len is a character
            {
                isalphabet=NULL; //isalphabet becomes NULL if it is a character and not an integer
            }


        } while (len > strlen(str) || isalphabet == NULL); //reiterate the loop until the conditions are satisfied

        for(int i = 0; i < len; i++)
    {
        printf("%dth digit of Key= ", i+1);
        scanf("%d", &key[i]);
    }
    return(0);  
}

我希望程序在扫描“len”时仅从用户那里获取整数值,并且“len”的值不应超过要加密的字符串的长度,如果不满足这些条件,请重复循环。有人可以指出我的错误并展示解决方案吗?另外,请向我解释为什么代码不能正常工作的原因。

4

2 回答 2

0

检查scanf("%d", len);是否有&遗漏的地方?也初始化len

更新:-抱歉迟到了,好吧,实际上您需要纠正的地方很少,抱歉我没有在第一篇文章中指出它们。

1) 更正标题包含分隔符。使用<stdio.h>代替"stdio.h"

2) 初始化len = 0

3)阅读后刷新标准输入。如果您真的输入了一个字符,scanf(%d,&len)则不会清除它/读取它。因此,由于字符卡在标准输入中,您将陷入无限循环。最后一个 for 循环也是如此。幸运的是,您不会被卡住,但循环会过早结束。

4) isalphabet=NULL, isalphabet 是 int,NULL 基本上是一个 0x0 值的 void 指针,你应该将 0 分配给一个 int。

5)所以你进入了 isalphabet=0 的循环,数字不是字母,你没有触摸 isalphabet,并且 while 循环结束isalphabet==NULL,这里也许它会以 true 运行,然后 while 循环再次开始。那么循环中断条件何时设置为isalphabet

6)为什么还要使用cstringin c 代码?为什么不string.h(但这更多是个人选择:))

len > strlen(7 )更正len >= strlen

我编辑了一点,检查它是否有效

//An Under-Construction program to implement OTP (One time Pad) encryption     
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
    char str[10000], key[10000];
    printf("Enter the string:- ");
    scanf("%[^\n]", str); //stops scanning when user presses return

    int len /* stores the number of digits of the OTP key*/, isalphabet=0;
        do
        {
            printf("What is the length of the key you are entering?:-");
            scanf("%d", &len);
            fflush(stdin);

            if( isalpha(len) ) // Checks if len is a character
            {
                isalphabet=1; //isalphabet becomes NULL if it is a character and not an integer
            }


        } while (len >= strlen(str) || isalphabet == 1); //reiterate the loop until the conditions are satisfied

        int i;
        for(i = 0; i < len; i++)
    {
        printf("%dth digit of Key= ", i+1);
        scanf("%d", &key[i]);
    }
    return(0);  
}
于 2013-04-13T11:56:29.287 回答
0

首先,scanf("%d", len); 应该

scanf("%d", &len);

strlen(str) 返回长度,比较应该是

len > (strlen(str) -1)

和 if 是否为 alpha 的比较可以在 while 循环内完成。检查此代码。

#include "stdio.h"
#include "string.h"
#include "ctype.h"

#define TRUE 1
#define FALSE 0

int main()
{
    char str[10000];
    char key[10000];

    printf("Enter the string:- ");
    scanf("%[^\n]", str); //stops scanning when user presses return

    int len = 0;
    int isalphabet= TRUE;
    int apply = 1;
    do
    {
        printf("What is the length of the key you are entering?:-");
        scanf("%d", &len);

        isalphabet= isalpha(len);
        apply = (len > (strlen(str) -1)) ;

    } while (!apply || isalphabet); //reiterate the loop until the conditions are satisfied

    int i;
    for(i = 0; i < len; i++)
    {
        printf("%dth digit of Key= ", i+1);
        scanf("%c\n", &key[i]);
    }

    for(i = 0; i < len; i++){
        printf("key[%d] = %c\n", i, key[i]);
    }
    return(0);  
}
于 2013-04-13T11:56:43.247 回答