过去几天我一直在阅读SO,试图弄明白这一点,我很难过。我想读取两个32位字节数组(来自stdin,输入将是十六进制)和xor它们,然后打印结果。
到目前为止,我已经尝试过使用scanf,fgets和gets。我的想法是将大十六进制数读入char缓冲区并在for循环中执行xor,直到我点击EOL(带有fgets)或空终止符。到目前为止,我的输出甚至都没有。我尝试了很多变化,但我只会在下面发布我最新的失败。我一直试图完成的挑战是:http://cryptopals.com/sets/1/challenges/2/
我在C中尝试它,因为我真的想学习C,但我真的很沮丧,没有这些尝试工作。
#include <stdio.h>
#include <math.h>
int main()
{
char buff1[100];
char buff2[100];
char buff3[100];
int size = sizeof(buff1);
puts("Enter value\n");
fgets(buff1, size, stdin);
puts(buff1);
puts("Enter value\n");
fgets(buff2, size, stdin);
puts(buff2);
for (int i = 0; i != '\n'; i++) {
buff3[i] = buff2[i] ^ buff1[i];
printf("%x", buff3[i]);
}
return 0;
}
答案 0 :(得分:2)
使用sizeof()时,它应该与类型一起使用,而不是数据。例如,如果你想要100个字符的空间,你需要找到sizeof(char)然后乘以100来找出你需要多少字节并进入缓冲区。 char通常是一个字节,因此需要100个字节。 fgets()可以工作,但我更喜欢使用这个
int getchar()
当用户停止时 输入换行符/终止符。既然你不知道stdin会有多少个字符,你呢 需要动态增加缓冲区的大小,否则会溢出。出于这个问题的目的,你可以把它变成一个非常大的数组,检查它是否会溢出然后终止程序。所以回顾一下这些步骤。
1。)创建一个大数组
2.)循环遍及getchar()并在输出为终结符时停止,请注意 你读了多少个字符。
3。)由于两个缓冲区都保证具有相同的字符,因此可以使用 最终数组等于许多字符的大小。
4.。)对于getchar()的循环,当字符出现时,xor与第一个数组相同 并将结果放入最终数组中。您应该尝试使用1个数组 之后再去做一些C练习。
祝你好运!编辑:
可以使用fgets(),但根据实现情况,了解读入了多少个字符很有用。
答案 1 :(得分:0)
#include <string.h>
#include <ctype.h>
static inline unsigned char hc2uc(char d){
const char *table = "0123456789abcdef";
return strchr(table, tolower(d)) - table;
}
...
for(int i=0;buff1[i]!='\n';i++){
buff3[i]=hc2uc(buff2[i])^hc2uc(buff1[i]);
printf("%x",buff3[i]);
}