2017-06-16 124 views
2

我對C很陌生,通過項目工作來幫助激勵我學習。我很難從sh popen獲得輸出。經過大量的搜索和試驗的時間和我碰到一個很老的跌跌撞撞後,他們使用不確定strcpy在這種情況下的工作方式

strcpy(str + size - 1,buf); 

這是這個我能找到的第一個也是唯一例子,這是工作。它看起來像是在str結尾處用buf中的內容覆蓋終止字符。那安全嗎?我還沒有完全掌握它如何存儲所有這些數據,並將結果數字更改爲高於+2的任何數值會導致分段錯誤或無效的下一個大小。完整的代碼是低於

int dns_probe(char * hostname) 
{ 
    char * digLoop[4] = {"ns ","a ","cname ","mx "}; 
    int i; 
    char outage[1]; 
    char *str = NULL; 
    char *temp = NULL; 
    unsigned int size = 1; 
    unsigned int strlength; 

    for (i = 0; i < 4; i++) 
    { 
     char *digcmd = concatCMD(digLoop[i],hostname); 

     FILE * dig = popen(digcmd,"r"); 
     char bufer[256]; 
     while(fgets(buf,sizeof(buf),dig) != 0){ 

      strlength = strlen(buf); 

      temp = realloc(str, size + strlength); 
      str = temp; 

      strcpy(str + size - 1,buf); 
      size += strlength; 
     } 

     pclose(dig); 
     free(digcmd); 

    } 
    printf("%s",str); 
} 

真的只是想確保我不會讓自己在路上遇到問題。

+0

我想你有'temp = realloc()'和'str = temp'之間的錯誤檢查,並且爲了清楚起見而刪除它?否則,您可能會通過空指針進行寫入。 –

回答

1

是的,這是安全的,只要realloc()確保緩衝區足夠大(和它)。

之前realloc()你可能有:

 +---+---+---+----+ 
buf: | f | o | o | \0 | size=4 
    +---+---+---+----+ 

然後讓我們假設"bar"閱讀,因此:

strlength = strlen("bar") = 3 

然後temprealloc() ated長度4 + 3 = 7:

 +---+---+---+----+---+---+---+ 
temp: | f | o | o | \0 | ? | ? | ? | 
     +---+---+---+----+---+---+---+ 

然後buf設置爲temp(在這裏應該有NULL - 這裏,順便說一句)。

最後,我們strcpy()"bar"buf + 4 - 1,即buf[3]

 +---+---+---+---+---+---+----+ 
buf: | f | o | o | b | a | r | \0 | 
     +---+---+---+---+---+---+----+ 

顯然,這是緩衝和以前相同的大小,和緩衝外界沒有字符被觸摸。

+0

好的,所以realloc()on temp會在我str = temp時繼續;這有助於很多謝謝。 (沒有足夠的代表upvote這個) –

0
 `temp = realloc(str, size + strlength);` 

//將str的buf重新分配給length(size + strlength),然後將更多的字節寫入新分配的內容。初始長度爲1,str的緩衝區在這裏是安全的。 但是,強烈建議使用strcpy,這更安全。

而這裏,https://www.tutorialspoint.com/c_standard_library/c_function_strcpy.htm你可以找到一些簡單的案例供學習。

相關問題