我正在尝试了解打印字符数组的输出,它在ideone.com(C ++ 4.3.2)和我的机器(Dev c ++,MinGW编译器)上给我变量输出
1)
#include<stdio.h>
main()
{
char a[] = {'s','t','a','c','k','o'};
printf("%s ",a);
}
它打印&#34; stacko&#34;在我的机器上,但不能在ideone
上打印任何内容2)
#include<stdio.h>
main()
{
char a[] = {'s','t','a','c','k','o','v','e'};
printf("%s ",a);
}
在ideone上:它打印&#34; stackove&#34;当我运行这个程序时,只有第一次打印后续的时间 在我的dev-c上:它打印&#34; stackove .; || w&#34; 当我尝试在没有任何&#39; \ 0&#39;的情况下打印这种字符数组时,IDEAL OUTPUT应该是什么?最后,它似乎在各地提供可变产出。请帮忙 !
答案 0 :(得分:2)
%s
转换说明符需要一个字符串。 字符串是一个字符数组,包含终止空字符'\0'
,用于标记字符串的结尾。因此,您的程序本身会调用未定义的行为,因为printf
超出数组访问内存的数组范围,寻找不存在的终止空字节。
您需要的是
#include <stdio.h>
int main(void)
{
char a[] = {'s', 't', 'a', 'c', 'k', 'o', 'v', 'e', '\0'};
// ^
// include the terminating null character to make the array a string
// output a newline to immediately print on the screen as
// stdout is line-buffered by default
printf("%s\n", a);
return 0;
}
您还可以使用字符串文字
初始化数组#include <stdio.h>
int main(void)
{
char a[] = "stackove"; // initialize with the string literal
// equivalent to
// char a[] = {'s', 't', 'a', 'c', 'k', 'o', 'v', 'e', '\0'};
// output a newline to immediately print on the screen as
// stdout is line-buffered by default
printf("%s\n", a);
return 0;
}