为什么我不能在代码中的 %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
输出。
我是 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
输出。