printf如何打印非空终止字符串?

Nik*_*nka 6 c

c编程书说我的字符串必须为空终止以使用printf打印它,但仍然以下程序打印字符串尽管它是非空终止!

#include <stdio.h>
#include <stdlib.h>

int main(){
    int i ;
    char str[10] ;
    for(i = 0 ; i < 10 ; i++ ) {
        str[i] = (char)(i+97) ;
    }

    printf("%s",str) ;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用codeblocks IDE.

iab*_*der 10

读取超出数组边界的未定义行为,实际上是不幸的是它没有崩溃,如果你运行足够多次或者在函数中调用它可能(或可能不)崩溃,你应该总是终止字符串,或使用宽度说明符:

printf("%.10s", str);
Run Code Online (Sandbox Code Playgroud)


And*_*ter 5

无论在第10个元素之后是str什么,都是空的.该null超出了数组的已定义边界,但C没有数组边界检查.在你的情况下,这就是运气的原因.

  • 每当你发现自己想知道编译器是否坏了,你就不会对自己的代码或自己对问题的理解有所了解.作为一个新手,*总是*假设问题在于你. (3认同)
  • @ user189535:所以现在在`char str [10]`之后在下一行声明另一个数组.称之为`ch​​ar str2 [10]`.用'B'或任何你想要的东西填充它.现在打印str,看看会发生什么. (2认同)