c - 反转字符串时长度增加

标签 c

我正在学习“The C Programming Language”并尝试反转 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;
}

最佳答案

一旦你反转字符串需要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

关于c - 反转字符串时长度增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49547606/

相关文章:

c - 多核时钟计数器一致性

c - 销毁结构(释放内存)

c - scanf() 将换行符保留在缓冲区中

c - 为什么 C 中 struct 的大小不等于所有变量大小的总和;

c++ - 将即时任务添加到 `CFRunLoop` 的最简单方法?

c - C 中的标准库和彩色输出

c - 如何使用 kerberos 安全地签名和加密消息?

c - 在 C 中格式化日历

c - 获取字符数组的长度

c - 一元运算有时是自杀性的。弄乱 C 代码