反转弦时长度增加

时间:2018-03-29 03:36:13

标签: c

我正在通过“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;
}

6 个答案:

答案 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';
}