我正在通过“C编程语言”并尝试反转C风格的字符串。我的理解是像“voldemort”这样的字符串文字表示为9个字符后跟空字符的字符数组(每个字符的大小为1):
v o l d e m o r t \0
_ _ _ _ _ _ _ _ _ _
我想要反转字符串的方法是找到长度,然后使用它来声明一个适当长度的数组,并将其定义为反向,最后保留一个空值。
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;
}
答案 0 :(得分:6)
反转字符串后需要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
答案 1 :(得分:3)
您需要零终止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';
}
答案 2 :(得分:2)
正如其他人所说,你没有用空字符终止字符串。我只是想指出,你很幸运,程序成功运行,因为没有终结器,strlen()将很好地开始读取字符串结束后发生的任何垃圾内存。这是它不应该触摸的记忆,迟早你会给自己一个分段错误。在你的情况下,在操作系统注意到并杀死你的程序之前,那个垃圾中恰好是一个空字符。
答案 3 :(得分:1)
因为你没有初始化char tset [len + 1];它可能包含未定义的值,因为您没有设置&#39; \ 0&#39;最后它显示随机值。您可能需要将反向功能更改为:
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。
此致
答案 4 :(得分:1)
函数:reverse()
无法终止反向字符串,因此对mystrlen()
的第二次调用继续计算字符,直到找到包含'\ 0'<的某个“随机”字符为止/ p>
由于此“随机”字符将超出tset[]
数组的末尾,因此发布的代码包含未定义的行为。
答案 5 :(得分:1)
您忘记添加'\ 0'字符来区分字符串的结尾。
新的反向功能 - &gt;
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';
}