2012-11-21 64 views
2
char symbols[16] = ""; 
int index = 0; 
while (1) 
{ 
    if (index % 2) 
     snprintf(symbols, sizeof symbols, "a%s", symbols); 
    else 
     snprintf(symbols, sizeof symbols, "b%s", symbols); 

    index++; 

    printf("%s\n", symbols); 
} 

輸出的外觀:A => BB => AAA => BBBB的snprintf()不能用於就地修改字符串工作

我想輸出如下:A => BA => ABA =>巴巴

回答

7

這是未定義的行爲。從C99標準部7.19.6.5的功能的snprintf

的snprintf的功能相當於fprintf中,不同之處在於輸出被寫入 數組(通過參數s中指定的),而不是流。如果n爲零,則不寫任何內容, 和s可能是空指針。否則,超出n-1的輸出字符將被丟棄,而不是寫入數組,並且在實際寫入數組的字符的末尾寫入空字符 。 如果在重疊的對象 之間進行復制,則行爲未定義。

你需要做的symbols副本用作在snprintf()調用的參數:

char symbols[16] = ""; 
char symbols_copy[16]; 
int index = 0; 
while (index++ < 15) 
{ 
    memcpy(symbols_copy, symbols, sizeof(symbols)); 

    if (index % 2) 
     snprintf(symbols, sizeof symbols, "a%s", symbols_copy); 
    else 
     snprintf(symbols, sizeof symbols, "b%s", symbols_copy); 

    printf("%s\n", symbols); 
} 

見演示http://ideone.com/GvnW7D

0

可以毫不snprintf做太多,當然:

char symbols[16] = ""; 
for(int i=0; i<15; ++i) { 
    memmove(&symbols[1], symbols, i); 

    if (i % 2) { 
     symbols[0] = 'a'; 
    } else { 
     symbols[0] = 'b'; 
    } 
    printf("%s\n", symbols); 
}