刷题《C programming language》Exercise 5-5
#include <stdio.h>
#include <string.h>
char *strncpy( char *s, const char *t, size_t n)
{
if( !s )
return 0;
char * s_tmp = s;
const char * t_tmp = t;
int i = 0;
for( ; *t_tmp != '\0' && i < n || *s_tmp == '\0' ; i++ )
{
*s_tmp++=*t_tmp++;
}
return s;
}
char *strncat( char *s, const char *t, size_t n )
{
if( !s )
return 0;
char * s_tmp = s;
const char * t_tmp = t;
while( *s_tmp != '\0' )
{
s_tmp ++;
}
for( int i = 0; *t_tmp != '\0' && i < n; i++ )
{
*s_tmp ++ = *t_tmp ++;
}
*s_tmp = '\0';
return s;
}
int strncmp( const char *s, const char *t, size_t n )
{
if( !s && !t )
return 0;
const char * str1 = s;
const char * str2 = t;
for( int i = 0; (*str1 != '\0' || *str2 != '\0') && i < n; i++ )
{
if ( *str1 != *str2 )
{
return *str1 - *str2;
}
else
{
str1++;
str2++;
}
}
return 0;
}
int main()
{
char str1[100] = "Hello World";
char str2[100] = "Artificial Intelligence";
char str3[100] = "Hellooo";
printf("strncpy(Hello World, %s, 6)=%s\n", str3, (char *) strncpy( str1, str3, 6) );
printf("strncat(HellooWorld, %s, 100)=%s\n", str2,(char *) strncat( str1, str2, 100) );
printf("strncmp(HellooWorldArtificial Intelligence, %s, 6)=%d\n", str3, strncmp( str1, str3, 6) );
printf("strncmp(HellooWorldArtificial Intelligence, %s, 100)=%d\n", str2, strncmp( str1, str2, 100) );
}
1. 注意跟string.h函数库的函数重载时函数的原型相同
char *strncpy( char *s, const char *t, size_t n)
char *strncat( char *s, const char *t, size_t n )
int strncmp( const char *s, const char *t, size_t n )
2. 与逻辑判断要先满足
*str1 != '\0' || *str2 != '\0' && i < n
(*str1 != '\0' || *str2 != '\0') && i < n
第一个条件的逻辑意思是:只要 *str1
或 *str2
中有一个不为 '\0'(即字符串未结束),且 i
小于 n
,循环就会继续执行。第二个条件就能保证在两个字符串中任意一个到达了结束符 '\0' 或者已经比较了 n
个字符后结束循环,而不会出现上述的逻辑错误。