我試圖創建一個填充函式,為一個字串添加一個下劃線。字串的長度應該是16,如果字串小于16,該函式應該添加一個下劃線,直到字串長度為16,然后回傳填充的字串。如果字串大于16,填充函式應該忽略這些字符,并回傳字串的前16個字符。
char* padding(char* plaintext) {
char ch = '_'/span>;
size_t len = strlen(plaintext)。
size_t lench = 17 - len;
char *p_text = malloc(len 1 1)。
strcpy(p_text, plaintext)。
if (len < 17) {
int i;
for (i = lench; i < 16; i ) {
p_text[i] = ch;
}
}
// p_text[17] = '';
return p_text;
}
int main() {
char *key = "0123456789ABCDEF"/span>。
while (1) {
char plaintext[WIDTH 1] 。
printf("輸入一個字串:")。
fgets(plaintext, WIDTH 1, stdin) 。
if (plaintext[0] == '
' || plaintext[0] == '
')
break;
char* padded_plaintext = padding(plaintext);
printf("padded plaintext = %s
", padded_plaintext)。)
printf("
")。)
}
return 0;
這段代碼回傳一個奇怪的結果。
uj5u.com熱心網友回復:
你為p_text分配的空間不應該取決于輸入。它應該永遠是17。 如果len 1 1 < 16,那么訪問p_text[i]將導致您所使用的某些i值的未定義行為。 你應該替換為:
char *p_text = malloc(len 1 1)。
與
char *p_text = malloc(17)。
并且在寫入前檢查p_text是否為NULL。
另外,注釋出來的/p_text[17] = '';是錯誤的。這應該是
p_text[16] = ''/span>。
uj5u.com熱心網友回復:
考慮到這個問題的一個干凈的解決方案。希望看到這個(和附帶的解釋)能有所幫助。
char *padded_string(char *src, int width, char ch) {
char *dest = calloc(1, width 1) 。
strncpy(dest, src, width)。
for (int i = 0; i < width; i ) {
if (! dest[i]) {
dest[i] = ch;
}
}
return dest。
}
我們通過使用calloc分配width 1位元組來為自己提供一個干凈的作業空間。使用calloc將確保所有位元組被設定為0。當在C語言中處理字串時,它們需要以空結尾,所以這非常有用。
我們將src的內容復制到dest。使用strncpy可以確保我們不會在源字串比我們希望最終得到的字串長的情況下獲得緩沖區溢位。
接下來我們從0開始回圈,width次。如果目標字串中位于i的字符是一個'',我們將在該索引處插入填充字符。
現在,因為我們使用了calloc,并且我們分配了一個超出我們所需要的字符長度的額外位元組,字串已經是空尾的,我們可以簡單地回傳它的指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/324463.html
標籤:
上一篇:如何在Tkinterpython中把字串轉換為整數?
下一篇:不能分配給文字,Python
