【问题标题】:Big number entered as an input automatically changes. How do i stop this?作为输入输入的大数字会自动更改。我该如何阻止这个?
【发布时间】:2020-06-16 05:14:52
【问题描述】:

我正在尝试在不使用数组或字符串的情况下创建加密算法,因为这些是我正在处理的分配规则。正因为如此,我在试图找出一种使用算法的方法时遇到了很多问题。

基本上,用户必须输入 24 位二进制文​​本。例如:'010000010100000101000001' 该算法应该与密钥'01000001'进行XOR运算并将结果的位分成3个8位部分,并找到8位部分的二进制代码的十进制值。然后将它们分别转换为 ASCII 字符。

我想到的方法是定义一个值为 1000000000000000000000000(24 个零)的整数,这样输入的零就不会在前面消失。然而,因为数字很大,所以 '010000010100000101000001' 的输入变成了 '947938113'

我让程序打印输入看看:(输入是'010000010100000101000001')

#include <stdio.h>
#include <math.h>

int main(){

int count,tot,cho,key=1010000010100000101000001,temp,encry_tex;
char;

printf("Which base will you use to enter text (base 16/2)?");
scanf("%d",&cho);

temp=1000000000000000000000000;

if (cho==2)
{
   printf("Please enter the text to encrypt: ");
   scanf("%d",&encry_tex);

    tot=temp+encry_tex;  /* this part is not important, that's how the 
                            program was supposed to go but they don't mean 
                          anything to the question im asking. */
    tot=tot+key;

   printf("%u",encry_tex);
}
}

如果我输入 10001001 这样的输入,它仍然给我 10001001,当数字变大时就会出现问题。

我该如何解决这个问题?

【问题讨论】:

  • 在大多数系统上,int 是 32 位的,最大值约为 20 亿。 64 位无符号数的最大值约为 1.8e19。分配给temp 的数字在1 之后有24 个零,因此它不适合C 编译器支持的任何类型。为此,您需要一个大整数库。另一种方法是以十六进制输入数字,或以 3 个单独的 8 位二进制数字形式输入。
  • 编译器没有警告你temp=1000000000000000000000000;吗?这应该。如果没有,您需要更多编译器警告选项(尽管没有必要从中获得警告),或者您需要获得更好的编译器。当你在学习 C 时(30 多年后我还在学习),假设编译器比你知道更多的 C。如果它打算警告您,请将其视为错误。并确保它为您提供尽可能多的帮助。如果您使用 GCC,gcc -O3 -g -Wall -Wextra -Werror 是一个不错的起点。在我愿意运行程序之前,我会使用这些选项和更多选项。
  • 您也可以使用getchar() 一次读取一个字符,然后使用 shift &lt;&lt; 和 OR | 构建数字。
  • 如果您尝试输入二进制数,请检查您的编译器是否支持 0b 作为前缀(例如 0x 用于十六进制)。一些编译器会这样做;有些没有。该符号是现代 C++(C++11 或 C++14,IIRC)的一部分。它不是标准 C 的一部分。
  • 另一种方法是将二进制数组定义为字符串,并使用strtol()strtoll() 将其转换为整数类型。

标签: c binary integer ascii


【解决方案1】:

以下建议的代码:

  1. 避免“字面折叠”
  2. 执行所需的功能
  3. 删除不需要的#include 语句
  4. 干净编译
  5. 执行所需的功能
  6. 正确检查 I/O 错误
  7. 遵循公理:每行只有一个语句,并且(最多)每个语句有一个变量声明。

现在,建议的代码:

#include <stdio.h>
//#include <math.h>
#include <stdlib.h>


int main( void )
{
    //int count;
    int tot;
    int cho;
    //int key=1010000010100000101000001;
    int key = 0x01414141;
    //int temp;
    int encry_tex;


    printf("Which base will you use to enter text (base 16/2)?");
    if( scanf("%d",&cho) != 1)
    {
        fprintf( stderr, "scanf for input number base failed\n" );
        exit( EXIT_FAILURE );
    }

    //temp= 0b1000000000000000000000000;
    int temp = 0;
    temp |= (int)0x80000000;

    if (cho==2)
    {
        printf("Please enter the text to encrypt: ");
        if( scanf("%d",&encry_tex) != 1 )
        {
            fprintf( stderr, "scanf for input of number to encrypt failed\n" );
            exit( EXIT_FAILURE );
        }

        tot=temp+encry_tex;  /* this part is not important, that's how the 
                                program was supposed to go but they don't mean 
                              anything to the question im asking. */
        tot=tot+key;

       printf("%u",encry_tex);
    }   
}

【讨论】:

  • 注意:cho 完全没用,除非代码会输入一个 char 字符串并转换该字符串。一般情况下,用户通过前导0x0b来确定数据格式
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2020-11-27
相关资源
最近更新 更多