我正在嘗試構建一個函式,該函式采用正整數并使用遞回將其表示在字串中。字串未初始化。
void intToStr(int num, char s[]){
if (num / 10 == 0) {
s[0] = num '0';
s[1] = '\0';
}
else {
intToStr(num / 10, s);
s[strlen(s)] = num % 10 '0';
s[strlen(s) 1] = '\0';
}
}
但我不明白為什么當我運行代碼時它會跳過這一行
s[strlen(s) 1] = '\0';
uj5u.com熱心網友回復:
在:
s[strlen(s)] = num % 10 '0';
s[strlen(s) 1] = '\0';
strlen執行第一行時不會保持不變。第一行在終止字串的空值上放置一個新字符。然后strlen(s)在第二行重新計算字串長度。由于空字符消失,strlen繼續尋找空字符。它回傳的長度取決于緩沖區中是否已經存在另一個空字符。如果您沒有初始化它,strlen可能會回傳一些更長的長度,或者程式可能會崩潰或以其他方式出現錯誤行為。
你可以用以下方法解決這個問題:
size_t length = strlen(s);
s[length] = num % 10 '0';
s[length 1] = '\0';
intToStr回傳長度也可能很方便,因此不必每次都重新計算:
size_t intToStr(int num, char s[])
{
if (num / 10 == 0)
{
s[0] = num '0';
s[1] = '\0';
return 1;
}
else
{
size_t length = intToStr(num / 10, s);
s[length] = num % 10 '0';
s[length 1] = '\0';
return length 1;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/380105.html
