C字符串末尾的'/0'问题

Posted 周洋的Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C字符串末尾的'/0'问题相关的知识,希望对你有一定的参考价值。

C语言的字符串要注意最后一位默认是‘/0‘的问题。这是一个易错点。

strlen()计算长度时不考虑末尾的‘\0‘

//例1
void test1()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
}
string定义的长度是10,str1的最后一位默认为‘\0‘,所以str1其实长度为11。strcpy()函数中,如果第二个串比第一个串长,是没有error的,第一个串的长度会增加,并且也可以正确的输出第一个串。
但是存在潜在的内存错误的问题,也就是说,在内存中,如果紧接string之后有内容,将被覆盖,这样会导致string之后的内存存取错误。
来看一个好的写法:
void test2()
{
    char string[10], str1[10];
    int i;
    for(i=0; i<9; i++)
    {
        str1[i]  = a;
    }
    str1[9] = \0;//体现水平的一步
    strcpy( string, str1 );
}

有的时候可能非常容易忽略这个小问题:

//例2
void test3(char* str1)
{
 if(str1 == NULL){
        return ;
 }
 char string[10];
 if( strlen( str1 ) <= 10 )
 {
 strcpy( string, str1 );
 }
}

这里if( strlen( str1 ) <= 10 )应该写成if( strlen( str1 ) < 10 ),因为strlen的结果未统计’\0’所占用的1个字节。

以上是关于C字符串末尾的'/0'问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言提取字符串中的所有数字

字符串长度怎么算

[react] Module not found: Can't resolve 'schedule' in 'C:Usersadcaldvmtn7myapp (代码片段

C语言关于小数存入数组函数编写

string类对象最后一个字符会是空字符吗?

YASnippet - emacs 的代码片段管理工具