C语言中,printf函数如何处理%s?
在C语言中的printf函数中的格式规范%s规定,对应的参数必须是以'\0'结束的表示的字符串。如[abc\0]。那么当这种情况:chararr[3]={'a','b',...
在C语言中的 printf 函数中的格式规范 %s 规定,对应的参数必须是以'\0'结束的表示的字符串。如 [a b c \0]。那么当这种情况:
char arr[3] = {'a', 'b', 'c'};
printf("%s", arr);
arr中没有存储 '\0' printf 函数 的 %s 是被怎么处理的呢?
linux下,用gcc编译上面的代码和执行,都没有问题的。
在执行char arr[3] = {'a', 'b', 'c'};对arr数组进行初始化前,用gdb调试:
(gdb) print a[2] // $1 = 8 '\b'
(gdb) print a[3] // $2 = -12 '\364'
然后我执行 char arr[3] = {'a', 'b', 'c'}; 这一句后停下,
(gdb) print a[2] // $3 = 99 'c'
(gdb) print a[3] // $4 = -12 '\364'
很明显的,a[2]经过赋值后是没问题的存的是字符 ‘c'。但它后面的内存中的内容(a[3])在赋值语句前后并没有改变都是 ’\364‘,也不是 '\0' ,但是最后 printf 打印出来的结果是 “abc”,不会有乱码,也不会报错。
这样是不是说明了编译器对此作出了处理呢?那么是怎么处理的呢? 展开
char arr[3] = {'a', 'b', 'c'};
printf("%s", arr);
arr中没有存储 '\0' printf 函数 的 %s 是被怎么处理的呢?
linux下,用gcc编译上面的代码和执行,都没有问题的。
在执行char arr[3] = {'a', 'b', 'c'};对arr数组进行初始化前,用gdb调试:
(gdb) print a[2] // $1 = 8 '\b'
(gdb) print a[3] // $2 = -12 '\364'
然后我执行 char arr[3] = {'a', 'b', 'c'}; 这一句后停下,
(gdb) print a[2] // $3 = 99 'c'
(gdb) print a[3] // $4 = -12 '\364'
很明显的,a[2]经过赋值后是没问题的存的是字符 ‘c'。但它后面的内存中的内容(a[3])在赋值语句前后并没有改变都是 ’\364‘,也不是 '\0' ,但是最后 printf 打印出来的结果是 “abc”,不会有乱码,也不会报错。
这样是不是说明了编译器对此作出了处理呢?那么是怎么处理的呢? 展开
6个回答
展开全部
C语言中,printf函数处理%s的函数原型如下:
case 's':
s = va_arg(args, char *);
if (!s) s = "<NULL>";
len = strnlen(s, precision);
if (!(flags & LEFT)) while (len < field_width--) *str++ = ' ';
for (i = 0; i < len; ++i) *str++ = *s++;
while (len < field_width--) *str++ = ' ';
continue;
首先判断打印字符串是否为空,如果为空,则填充"<NULL>",然后把打印内容拷贝到打印缓存区内。
case 's':
s = va_arg(args, char *);
if (!s) s = "<NULL>";
len = strnlen(s, precision);
if (!(flags & LEFT)) while (len < field_width--) *str++ = ' ';
for (i = 0; i < len; ++i) *str++ = *s++;
while (len < field_width--) *str++ = ' ';
continue;
首先判断打印字符串是否为空,如果为空,则填充"<NULL>",然后把打印内容拷贝到打印缓存区内。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
会从数组arr的首地址开始 一个字节一个字节的读取并输出 一直到内存中某个字节为0才停止
所以有时候 会输出乱码 因为这个字节里面是存储什么都有可能 有时候会弹出 某地址不可读
那是操作系统的内存保护机制 已经到一些没读取权限的内存 指针狂飙 就是这下场
你可以在非调试模式下 运行一下代码 看看情况
所以有时候 会输出乱码 因为这个字节里面是存储什么都有可能 有时候会弹出 某地址不可读
那是操作系统的内存保护机制 已经到一些没读取权限的内存 指针狂飙 就是这下场
你可以在非调试模式下 运行一下代码 看看情况
追问
请看问题补充
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
c编译器自动处理的,这个你不用担心,如果你定义的四个字符串数组,它就自己默认,如果定义的是字符数组就没有\0这一说了
追问
请看问题补充
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这种情况如果你直接用printf("%s", arr);打印出来会出现内存泄漏,不应该那样写。你就用下面的方法实现:
for(i = 0; i < 3; i++){
printf("%c", arr[i]);
}
for(i = 0; i < 3; i++){
printf("%c", arr[i]);
}
追问
请看问题补充
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询