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文字列を印刷するために使用することで、まだ未定義の動作を呼び出していることに注意してください。null で終了していません。

char buf_1[STR_BUF] = "";

それを修正する1つの方法です。

于 2013-10-24T03:49:53.177 に答える
1

論理 and( && ) は equals( = ) よりも優先されるため、 while 式は実際には次のようになります。

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

次のように変更します。

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

問題とnullターミネータを正しく処理する

于 2013-10-24T03:50:24.203 に答える