小编The*_*282的帖子

如果没有\ 0,c的printf函数如何知道如何停止?

我只是想知道你是否可以为我清理一些东西.

我们有一些示例代码来解释我的问题:

#include <stdio.h>

int main(void)
{
    char test[100];
    printf("%s",test);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我没有完全弄错的话,这应该在我声明之前随机输出一些在此内存地址处的字符,如果在虚拟环境中它是空的,则应该输出.所以,这是我的理解.在我输入内容之前保存的内存被理解为char并写入终端.例如ascii'a'= 97 = 01100001.这就是它输出'a'的原因.可能是别的什么.或无.然后它停止了.

但是如果我把'a'放在第一个位置然后像这样打印:

test[0] = 'a'
printf("%s",test);
Run Code Online (Sandbox Code Playgroud)

它将输出'a',另外输出一些字符或什么都没有然后停止.

这就是我理解数组的方式:数组是指向第一个地址的指针,括号是在将数字乘以sizeof(type)后对地址进行解引用.

因此,在这种情况下,在第一个例子的内存中找到的随机01100001(Ascii'a')应该与第二个例子中故意放置的01100001(Ascii'a')的printf无法区分.然而,当我运行printf时,我没有得到100个随机输出.我得到一个.而且我不认为随机字段通常设置为'\ 0'.

这意味着,我的理解在某处肯定是错的.请帮我理解我犯错误的地方.

c

1
推荐指数
1
解决办法
101
查看次数

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

我正确地知道cs50编程教程.在这里,我应该破解DES加密的字符串.

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

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

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

首先,我认为它可能会出于一些奇怪的原因而超出阵列并@从随机存储器中获取.这就是我将它从我的在线IDE复制到我的本地XCode的原因.仍然是相同的@符号.而现在我对它的来源感到困惑@.

链接到我的代码.

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define _XOPEN_SOURCE       // DES - implementation
#include <unistd.h>

// shorthands
#define cypher argv[1]

#define ascii_dot 46
#define ascii_slash 47
#define ascii_zero 48
#define ascii_nine 57
#define salt_size 64

#define majA 65
#define majZ 90

#define minA 97
#define minZ 122

int main(int argc, string argv[]) {
    // Checking input
    if …
Run Code Online (Sandbox Code Playgroud)

c printf cs50

-1
推荐指数
1
解决办法
137
查看次数

标签 统计

c ×2

cs50 ×1

printf ×1