如果我设置一个数组变量a [] =" abc" ,然后设置另一个数组变量b [] = {' d',' e' f'},我的最后一个输出代码是printf(" ;%s",b),它的输出值是" defabc",为什么?我的输出是数组b,但输出值将首先输出数组b,然后输出数组一秒。 整个代码都在下面。
#include<stdio.h>
void main(){
char a[]="abc";
char b[]={'d','e','f'};
printf("%s",b);
}
输出是&#34; defabc&#34;。 并且数组b的字符串长度是7为什么?
答案 0 :(得分:3)
在C中,所有字符串都应为null(即\0
)终止,因此您的第二个变量应如下所示:
char b[] = {'d', 'e', 'f', '\0'};
您可能很好奇为什么"defabc"
会打印出您的代码。答案是,所有局部变量都存储在stack-based memory layout中。所以你的内存布局如下:
|'d' | <-- b
|'e' |
|'f' |
|'a' | <-- a
|'b' |
|'c' |
|'\0'|
另请注意,printf("%s", ...)
会一直读到\0
,因此printf("%s", a)
按预期工作,但printf("%s", b)
打印"defabc"
。
答案 1 :(得分:0)
两个字符串的末尾都需要一个空终止符。你的第二个字符串没有定义为字符数组。
答案 2 :(得分:0)
正确声明字符串的方法
char b[] = { 'd', 'e', 'f', '\0' }; // null terminator required
或
char b[] = "def"; // null terminator added automatically
因此,此代码将打印def
作为输出
#include <stdio.h>
int main() {
char a[] = "abc";
char b[] = { 'd', 'e', 'f', '\0' };
printf("%s", b);
return 0;
}