1
#include <stdio.h>
#define STR_BUF    10000
#define STR_MATCH  7

void mystrncpy(char* s, char* t, int n) {
    while(*s++ = *t++ && n-- > 0);
}

int main() {
    int result;
    char str_s[STR_BUF] =  "not so long test string";
    char buf_1[STR_BUF];
    mystrncpy(buf_1, str_s, STR_MATCH);
    printf ("buf_1 (mystrncpy, 7 chars): %s\n", buf_1);
    return 0;
}

当我运行它时,什么也没发生

ian@ubuntu:~/tmp$ gcc myncpy.c -o myn&&./myn
buf_1 (mystrncpy, 7chars):
4

2 回答 2

7

赋值的优先级低于&&,因此您的while条件相当于:

while (*s++ = (*t++ && n-- > 0))

与或*s++相比。那不是你想要的。10

while ((*s++ = *t++) && n-- > 0)

应该修复它。

请注意,您仍然通过使用%s打印字符串来调用未定义的行为。它没有被空终止。

char buf_1[STR_BUF] = "";

是解决这个问题的一种方法。

于 2013-10-24T03:49:53.177 回答
1

逻辑 and( && ) 优先于 equals( = ) 所以你的 while 表达式实际上是:

while(*s++ = ( *t++ && n-- > 0 ) );

将其更改为:

while( ( *s++ = *t++ ) != '\0' && n-- > 0);

正确处理问题和空终止符

于 2013-10-24T03:50:24.203 回答