c - printf(“%s”)打印额外的@

时间:2016-09-19 16:41:29

标签: c printf cs50

我知道正在研究cs50编程教程。在这里,我应该破解DES加密的字符串。

首先,我专注于创建一个64位大数组,其中包含盐中使用的所有可能的字符。

在下一步中,我将其抛入两个for循环中,以打印出这两个for循环的所有可能组合。这就是我现在所处的位置。

出于调试原因,我只使用layoutDirection打印出来。 Salt定义为char printf("%s",salt)。但由于某些原因,它总是按预期打印出salt[2]xx@次更改,我不知道xx来自哪里。

首先,我认为它可能因某种奇怪的原因而超出数组,并从随机内存中获取@。这就是我将它从我的在线IDE复制到我的本地XCode的原因。仍然是相同的@符号。现在我对@的来源感到困惑。

Link to my code.

@

1 个答案:

答案 0 :(得分:5)

你还没有发布任何代码,但我猜你没有null终止传递给printf()的数组......

编辑好猜测:您将2个字符设置为char salt[2]并将其传递给printfprintf打印这些字符并继续从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数字。