strncpy()
将一个字符串复制到长度为10个字符的char* str中。现根据
strncpy()
手册,“警告:如果在src的前n个字节中没有空字节,则放置在dest中的字符串将不以空字符结尾。”这正是这里发生的情况。源字符串长度为26个字符,我复制了10个字符,因此在str末尾没有放置空字符。
但是当我打印从0开始到获取'\0'的str内容时,它表现正常。
为什么?当没有在末尾放置'\0'时,为什么循环会停在正确的位置?
我的理解是,它应该给出“分段错误”或至少不应该在那里停止并继续打印一些垃圾值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
int main()
{
char *str ;
str = malloc( sizeof( char ) * SIZE );
if( str == NULL )
exit( 1 );
memset( str, 0, sizeof( char ) * SIZE );
strncpy( str, "abcdefghijklmnopqrstuvwxyz", sizeof( char ) * SIZE );
unsigned int index;
for( index = 0; str[ index ] != '\0' ; index++ ) {
printf( "str[ %u ] has got : %c \n ", index, str[ index ] );
}
return 0;
}
以下是输出结果:
str[0]的值为:a str[1]的值为:b str[2]的值为:c str[3]的值为:d str[4]的值为:e str[5]的值为:f str[6]的值为:g str[7]的值为:h str[8]的值为:i str[9]的值为:j
感谢您的帮助。
编辑
有没有一种正确的方法来检查一个字符串是否以'\0'结尾?我一直认为上面的循环是最终的测试方法,但现在似乎不是。
比如说我们从其他程序员编写的函数中获取一个字符串。那么怎么知道它是否以正确的位置和'\0'结尾呢?也许没有,然后它会超出实际大小,直到我们得到一些'\0'。我们永远无法知道字符串的实际大小。
那么我们该如何应对这种情况呢?
有什么建议吗?