为什么我不能在代码中的 %s 之后打印 %c?

Why can't I print %c after %s in my code?

我是 C 编程新手,正在学习获取字符串输入。我尝试使用 malloc:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {

    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);
    s = realloc(s, strlen(s) + 1);    
    
    printf("%s ",s[2]);
    printf("%c",s[2]);
    return 0;
}

当我运行这个时,没有打印任何东西。但是当我把 %c printf 放在 %s printf 之前时:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {

    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);
    s = realloc(s, strlen(s) + 1);    
    printf("%c",s[2]);
    printf("%s ",s[2]);
    
    return 0;
}

它 运行 显示 printf("%c",s[2]); 的结果。为什么会这样? printf 清除 char s 中的内存吗?

在 C 中,字符串只是 char 的数组,我们将其保存为 char *:计算机内存中我们存储 char 数组的位置的(一个内存地址,或者,一个指针)。

%c 标志告诉 printf 处理单个字符(即 s[2])。

然而,

%s 标志告诉 printf 处理存储在 s[2] 内存地址 中的整个字符串。例如,如果 s[2] = 'A',则 printf 将尝试访问存储在内存位置 'A' 的字符串。在 ASCII 中,字母 'A' 只是整数 65,它不是有效的内存位置,因此程序会出错。

在第一个实例中,程序可能在 printf 使用 %c 输出之前退出(由于使用 %s 时出错),而在第二个实例中, printf 在错误发生前使用 %c 输出。