簡體   English   中英

反轉弦時長度增加

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM