请教C语言高手解惑!!!疑问已在每句?号标注,谢谢~~~

#include <stdio.h>
char *mystrncpy(char *p1, char *p2, int n);
int main(void)
{
char str1[81];
char str2[81];
int n;
do
{
puts("input string1:");
gets(str1);
puts("input string2:");
gets(str2);
puts("input the number of copying char:");
scanf("%d",&n);
getchar();
puts("After copying:");
puts(mystrncpy(str1, str2, n));
puts("input any char except q to go on.");
gets(str1);
}while(*str1 != 'q');
puts("Quit.");
return 0;
}
char *mystrncpy(char *p1, char *p2, int n)
{
char *p=p1;
while(*p1++ != '\0') continue; 这句是什么意思??最后指向第一个空字符吗???
*--p1 = *p2; //*--p1把指针减一再取那里的值,但不是覆盖第一个空字符前的字符???还有的是当while条件不满足时p1还会++吗?
n--; //??下面不是有一个n--吗?这句可以省略吧???
while(n>0 && *p2 != '\0')
{
*++p1 = *++p2;
n--;
}
return p;
}
要求是:strncpy (sl,s2,n)函数从s2复制n个字符给sl,并在必要时截断s2或为其填充额外的空字符。如果s2的长度等于或大于n,目标字符串就没有标志结束的 空字符。函数返回sl。自己编写这个函数,并在一个使用循环语句为这个函数提供输入的完整程序中进行测试。

char *mystrncpy(char *p1, char *p2, int n)
{
char *p=p1;
while(*p1++ != '\0') continue; //扫描p1所指字符串,直到碰到第一个'\0',
//当while结束时p1指向'\0'的后一个字节
*--p1 = *p2; // 此时上面的while语句已经结束,因为p1指向'\0'字符的后一个字节,所以
//需要 先向前移一个字节,然后将p2的第一个字符覆盖p1所指字符串的'\0'字符
n--; //因为前面已经把p2字符串复制了一个字符到p1字符串,所以需要n--,
//由此可以看出,改程序有个bug,就是默认p2字符串至少含有一个字符,如果p2=NULL
运行程序,就会崩溃。
while(n>0 && *p2 != '\0')
{
*++p1 = *++p2;
n--;
}
return p;
}追问

while(*p1++ != '\0') continue; //
*--p1 = *p2;
请教一下,这句不是太懂,谢谢~。*p1++相当于*(p1++)吧?当它指向第一个第一个空字符时,不满足,跳过循环体continue语句,执行下一句*--p1 = *p2; 是吧?那么为什么会是p1指向'\0'的后一个字节?while(*p1++ != '\0')具体是怎么实现的?

追答

*p1++ 相当于*(p1++) , 语句执行之后,p1虽然向后移了一位,但是在while(*p1++ != '\0')语句中还是以++ 前的值进行比较,所以当while循环结束的时候,p1指向空指针的后一个位置。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-15
while(*p1++ != '\0') continue; //等于 while (*p1++ != '\0') ; 将定位到str1尾
*--p1 = *p2; //将str2的首字符赋值过去
while 循环判断那先判断,最后自加所以 *--p1回到str1的‘\0’ 位置
n--; //去掉应该是对的

附带一个MAN手册的的strncpy的源代码
char* strncpy(char *dest, const char *src, size_t n){
size_t i;
for (i = 0 ; i < n && src[i] != '\0' ; i++)
dest[i] = src[i];
for ( ; i < n ; i++)
dest[i] = '\0';
return dest;
} // linux里 size_t 类型就是无符号整形,ssize_t 类型就是带符号的整形
第2个回答  2011-08-15
只能说这个程序很不好,最好不要滥用指针。strlen()函数可以返回字符串有效长度,试着用这个重写一遍函数吧
相似回答