我正在嘗試反轉某些字串的大小寫,并且我做到了,但是我的回傳中有一些額外的字符,這是記憶體問題嗎?還是因為長度?
char* invertirCase(char* str){
int size = 0;
char* iterator = str;
while (*iterator != '\0') {
size ;
iterator ;
}
char* retorno = new char[size];
for (int i = 0; i < size; i ) {
//if capital letter:
if (str[i] < 96 && str[i] > 64) {
retorno[i] = str[i] 32;
}
// if lower case:
else if (str[i] > 96 && str[i] < 123) {
retorno[i] = str[i] - 32;
}
//if its not a letter
else {
retorno[i] = str[i];
}
}
return retorno;
}
例如,如果我嘗試將此函式與"Write in C"它應該回傳的值一起使用"wRITE IN c",但它會回傳"wRITE IN cyyyyYY±7?óY"并且我不明白這些額外字符來自哪里。
PS:我知道我可以使用長度函式,但這是來自學校的,所以在這種情況下我不能這樣做。
uj5u.com熱心網友回復:
將 1 添加到 char 陣列的大小。
char* retorno = new char[size 1];
在回傳之前添加一個以 null 結尾的字串retorno。
retorno[size] = '\0';
uj5u.com熱心網友回復:
您的輸出字串不是以空值結尾的
當您遍歷輸入字串時,您會遞增size直到達到 null。這意味著 null 不會復制到輸出字串。退出回圈后,您應該size再次遞增以捕獲結束。
順便說一句,如果有人將未終止的字串傳遞到您的函式中,將其限制size在某個最大值 ( ) 可能是個好主意。while(*iterator != '\0' && size < MAXSIZE)如果達到最大尺寸條件,則需要在輸出末尾顯式添加 null。
uj5u.com熱心網友回復:
你的字串應該被null終止;當您獲得字串的初始大小時,這就是您要查找的內容。創建新字串時,應分配size 1 chars 空間,然后retorno[size]應設定為空終止字符(即'\0')。當您嘗試列印char*using printfor cout(或類似機制)時,它將繼續列印字符,直到找到空終止字符,這就是您在預期輸出之后獲得垃圾值的原因。
另一方面,c 有一些有用的函式,比如std::islower/std::isupper和std::tolower/std::toupper
uj5u.com熱心網友回復:
據我所知,這里可能發生了兩件事:
'\0'就像這里提到的每個人一樣,在您的 char 陣列末尾缺少空終止字符 ( ) 可能會導致這種情況。- 這可能是您在函式之外列印字串結果的
retorno方式。invertirCase()
我在 C 14、C 17 和 C 20 中測驗了你的函式,它每次都回傳正確的結果,無論是在retornochar 陣列末尾還是不帶空終止字符。
在回傳之前嘗試在函式內部列印結果,以確定這是在函式內部還是外部引起的。像這樣:
char* invertirCase(char* str){
// [... truncated code here]
for (int i = 0; i < size; i ) {
// [... truncated code here]
}
cout << " **** TESTING INSIDE FUNCTION ****" << endl;
cout << "-- Testing index iteration" << endl;
for (int i = 0; i < size; i ) {
cout << retorno[i];
}
cout << endl;
cout << "-- Testing iterator iteration" << endl;
for (char* iterator = retorno; *iterator != '\0'; iterator ) {
cout << *iterator;
}
cout << endl;
cout << "-- Testing advanced for loop" << endl;
for (char character : retorno) {
cout << character;
}
cout << " **** END TESTING ****" << endl;
cout << endl;
return retorno;
}
通過這種方式,您可以確定問題是否發生在您的函式內部,或者問題是否由于您列印結果的方式而發生。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/448322.html
標籤:C
上一篇:生成所有排列集
