逆转字符串时长度增加

  • 本文关键字:增加 字符串 逆转 c
  • 更新时间 :
  • 英文 :


我正在使用" C编程语言",并试图逆转C风格的字符串。我的理解是,诸如" voldemort"之类的字符串表示为9个字符的字符数组(每个尺寸为1(,后跟一个null字符:

v o l d e m o r t 
_ _ _ _ _ _ _ _ _ _

我逆转字符串的想法是找到长度,然后使用它来声明适当长度的数组,并将其定义为将其定义为在末端保持零。

t r o m e d l o v 
_ _ _ _ _ _ _ _ _ _

但是,在我的反向字符串中,长度突然更长,我没有任何运气弄清楚为什么。

#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] != '') {
        ++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: %sn", test);
    printf("Original Length: %dn", mystrlen(test)); // 9
    printf("Original Size: %lunn", sizeof(test)); // 10
    printf("Reversed: %sn", tset);
    printf("Reversed Length: %dn", mystrlen(tset)); // 13 (expected: 9)
    printf("Reversed Size: %lun", 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] = ''; //this line required
    }

输出:

Original: voldemort
Original Length: 9
Original Size: 10
Reversed: tromedlov
Reversed Length: 9
Reversed Size: 10

您需要零终止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] = '';
}

正如其他人提到的,您没有用空字符终止字符串。我只是想指出您很幸运,该程序完全成功地运行了,因为没有终结者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个值初始化tsset。

问候

函数: reverse()无法终止反向字符串,因此 mystrlen()的第二个调用继续计数字符,直到找到包含' 0'<<<0'<<的'随机'字符/p>

由于此"随机"字符将超出tset[]数组的末尾,因此已发布的代码包含未定义的行为。

您忘了添加' 0'字符in in in缩。

新的反向函数 ->

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] = '';
}

最新更新