2013-10-24 30 views
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; 
} 

當我運行它,什麼都沒有發生我的單行strncpy有什麼問題:while(* s ++ = * t ++ && n--> 0);?

[email protected]:~/tmp$ gcc myncpy.c -o myn&&./myn 
buf_1 (mystrncpy, 7chars): 
+1

除了任何錯誤,它會在源字符串中看到空字符時停止。 'strncpy'用零個或多個空字符填充目標。另見[我對這個話題的咆哮](http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy.html)。 –

+0

「*我的單行問題出現了什麼問題?*」很難首先閱讀出錯信息。 – alk

回答

7

分配比&&優先級高,所以你while條件相當於:

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

相比之下*s++10。這不是你想要的。

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

應該修復它。

請注意,您仍然使用%s來調用未定義的行爲來打印字符串。它沒有被空終止。

char buf_1[STR_BUF] = ""; 

是解決這個問題的方法之一。

1

邏輯和(& &)採用的是等於更大的優先級(=),所以你同時表達其實是:

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

將其更改爲:

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

正確對待這個問題,空終止符