我的单线strncpy有什么问题:while(* s ++ = * t ++&& n--> 0);?

时间:2013-10-24 03:44:48

标签: c

#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):

2 个答案:

答案 0 :(得分:7)

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

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

*s++10进行比较。那不是你想要的。

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

应该修复它。

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

char buf_1[STR_BUF] = "";

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

答案 1 :(得分:1)

逻辑和(&amp;&amp;)采用等于(=)的更高优先级,因此你的while表达式实际上是:

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

将其更改为:

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

正确处理问题和null终结符