这个字符串怎么能打印出来

时间:2017-03-22 18:53:40

标签: c arrays

我是新手。我在数组中做了一些实验。我试过这个

#include <stdio.h>

int main()
{
    char arr[7] = "Network";
    printf("%s\n", arr);
    return 0;
}

输出网络

我也试过了,

int main()
{
    char arr[7] = "Its time to work";
    printf("%s\n", arr);
    return 0;
}

警告:字符数组的初始化字符串太长[默认情况下启用]

输出:**它的时间

我有这个版本的gcc -v gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu1~14.04.3)

为什么首先没有警告?为什么它给我输出'网络'代替垃圾或'网络',如果'%s'在第二种情况下最后追加'\ 0'?

2 个答案:

答案 0 :(得分:1)

在两个示例中,您使用字符串文字作为字符数组的初始值设定项。虽然它是隐式的,但字符串文字总是附加一个空字符。

C99,n1570 (downloadable here) 第6.4.5节字符串文字,第14段。 6说:

  

在转换阶段7中,附加值为零的字节或代码   每个由字符串文字产生的多字节字符序列   或文字。

此外,(信用于@Olaf)部分 6.7.9初始化,第7段。 14 它说:

  

字符类型数组可以由字符串初始化   文字或UTF-8字符串文字,可选择用大括号括起来。   字符串文字的连续字节(包括终止空值)   字符 如果有空间 或者数组的大小未知)   初始化数组的元素。 [ 强调 我的]

即使不明显,字符串文字初始值设定项2 name1 1 name2 包含8个字符,而变量"Network"只有7个空格:

arr

因为你的陈述:

"Network"   ->  |N|e|t|w|o|r|k|0|  
char arr[7] ->  | | | | | | | |

char arr[7] = "Network"; 中没有提供足够的空间,它会创建一个arr数组,不会创建字符串。将其用作字符串将导致 undefined behavior 。即任何事情都可能发生。

答案 1 :(得分:0)

基于我对这个帖子的学习

#include <stdio.h>

int main()
{
    char arr[7] = "Network";
    //printf("%s\n", arr);
    return 0;
}

是一个有效的计划。使用%s打印不是。它应该被视为一个字符数组。

int main()
{
    char arr[7] = "Its time to work";
    printf("%s\n", arr);
    return 0;
}

程序员在分配任何值时检查数组的大小是一个错误的程序。