[英]Length is increased while reversing a string
我正在通過“C編程語言”並嘗試反轉C風格的字符串。 我的理解是像“voldemort”這樣的字符串文字表示為9個字符后跟空字符的字符數組(每個字符的大小為1):
v o l d e m o r t \0
_ _ _ _ _ _ _ _ _ _
我想要反轉字符串的想法是找到長度,然后使用它來聲明一個適當長度的數組,並將其定義為反向,在結尾處保持null。
t r o m e d l o v \0
_ _ _ _ _ _ _ _ _ _
然而,在我的反向弦中,長度突然變長,我沒有任何運氣弄清楚原因。
#include <stdio.h>
int mystrlen(char s[]);
void reverse(char original[], char reversed[], int len);
int mystrlen(char s[]) {
int i = 0;
while (s[i] != '\0') {
++i;
}
return i;
}
void reverse(char original[], char reversed[], int len) {
int i, c;
for (i = 0; i < len; ++i) {
reversed[i] = original[len-i-1];
}
}
int main() {
int len;
char test[] = "voldemort";
len = mystrlen(test);
char tset[len+1];
reverse(test, tset, len);
printf("Original: %s\n", test);
printf("Original Length: %d\n", mystrlen(test)); // 9
printf("Original Size: %lu\n\n", sizeof(test)); // 10
printf("Reversed: %s\n", tset);
printf("Reversed Length: %d\n", mystrlen(tset)); // 13 (expected: 9)
printf("Reversed Size: %lu\n", sizeof(tset)); // 10
return 0;
}
一旦你反轉字符串需要NUL
終止
void reverse(char original[], char reversed[], int len) {
int i, c;
for (i = 0; i < len; ++i) {
reversed[i] = original[len-i-1];
}
reversed[i] = '\0'; //this line required
}
輸出:
Original: voldemort
Original Length: 9
Original Size: 10
Reversed: tromedlov
Reversed Length: 9
Reversed Size: 10
你需要零reversed
終止reversed
字符串:
void reverse(char original[], char reversed[], int len) {
int i, c;
for (i = 0; i < len; ++i) {
reversed[i] = original[len-i-1];
}
reversed[len] = '\0';
}
正如其他人所提到的,您沒有使用null字符終止字符串。 我只是想指出你很幸運,程序成功運行,因為沒有終結器strlen()將開始很好地讀取字符串結束后發生的任何垃圾內存。 這是它不應該觸摸的記憶,遲早你會給自己一個分段錯誤。 在你的情況下,在操作系統注意到並殺死你的程序之前,那個垃圾中恰好是一個空字符。
因為你沒有初始化char tset [len + 1]; 它可能包含未定義的值,並且由於您沒有在結尾處設置'\\ 0',因此它顯示隨機值。 您可能需要將反向功能更改為:
void reverse(char original[], char reversed[], int len) {
int i, c;
for (i = 0; i < len; ++i) {
reversed[i] = original[len-i-1];
}
reversed[len]='\0';
}
或者用0值初始化tsset。
問候
函數: reverse()
無法終止反向字符串,因此對mystrlen()
的第二次調用繼續計算字符,直到找到一些包含'\\ 0'的'隨機'字符
由於此“隨機”字符將超出tset[]
數組的末尾,因此發布的代碼包含未定義的行為。
你忘了添加'\\ 0'字符來區分字符串的結尾。
新的反向功能 - >
void reverse(char original[], char reversed[], int len) {
int i, c;
for (i = 0; i < len; ++i) {
reversed[i] = original[len-i-1];
}
reversed[len] = '\0';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.