我知道正在研究cs50编程教程。在这里,我应该破解DES加密的字符串。
首先,我专注于创建一个64位大数组,其中包含盐中使用的所有可能的字符。
在下一步中,我将其抛入两个for循环中,以打印出这两个for循环的所有可能组合。这就是我现在所处的位置。
出于调试原因,我只使用layoutDirection
打印出来。 Salt定义为char printf("%s",salt)
。但由于某些原因,它总是按预期打印出salt[2]
(xx@
次更改,我不知道xx
来自哪里。
首先,我认为它可能因某种奇怪的原因而超出数组,并从随机内存中获取@
。这就是我将它从我的在线IDE复制到我的本地XCode的原因。仍然是相同的@
符号。现在我对@
的来源感到困惑。
@
答案 0 :(得分:5)
你还没有发布任何代码,但我猜你没有null终止传递给printf()
的数组......
编辑好猜测:您将2个字符设置为char salt[2]
并将其传递给printf
。 printf
打印这些字符并继续从salt
数组末尾的内存中读取字符,直到找到结束字符串的'\0'
字节。
有多种方法可以解决这个问题:
您可以使数组更长,并在字符后设置'\0'
:
char salt[3];
...
salt[2] = '\0';
printf("%s", salt);
您可以使用2
格式的精度值printf
从阵列中打印最多2
个字节:
printf("%.2s", salt);
您可以从数组中打印单个字节:
putchar(salt[0]);
putchar(salt[1]);
至于为什么你一直得到一个@
,没有明确的答案,因为你遇到了未定义的行为,所以任何事情都可能发生......但是注意@
有价值64
这是您存储在局部变量l
中的值。 salt
数组可能位于l
变量之前的内存juste中。在little endian中,值64存储在l
的第一个字节中。
另请注意,建议不要为变量使用名称l
,因为很难区分固定字体中的1
数字。