簡體   English   中英

C 代碼從字符串中刪除錯誤的字符

[英]C code removing wrong character from string

此代碼應該從給定的字符串中刪除任何前導空格,並且它工作正常。 然后,似乎沒有任何理由,它開始刪除單詞中間的字符。 在這個例子中,給出了“CHEDDAR”這個詞,它沒有前導空格,所以它應該像輸入一樣返回,但是它返回“CHEDDR”,我不知道為什么。 有誰知道這怎么可能? 我認為它與指針和內存有關,但我不精通 C,我需要一些幫助。 在 RHEL 上運行。 謝謝。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define REMOVE_LEADING_SPACES(input)                       \
           {                                            \
           stripFrontChar( input, ' ' );                         \
           }


char *stripFrontChar(char *startingString, char removeChar) {
    while (*startingString == removeChar)
        strcpy(startingString, startingString + 1);
    return (startingString);
}

void main(argc, argv)
    char **argv;int argc; {
    char *result = "CHEDDAR";
    REMOVE_LEADING_SPACES(result);
    printf("%s\n", result);
}

編輯:現在有點晚了,但根據我的評論,我應該表明這個詞(我以 CHEDDAR 為例)是從文件中讀取的,而不是我的代碼中顯示的文字。 我試圖為這個問題簡化它,現在我意識到這是一個完全不同的場景,所以我不應該這樣做。 謝謝,看來我需要使用 memmov。

EDIT2:實際上有一個像“CHEDDAR”這樣的空間,所以我真的只需要把它改成memmov,再次感謝大家。

您使用重疊內存區域復制字符串:

strcpy(startingString, startingString + 1);

從 C 標准:

7.24.2.3 strcpy 函數

如果復制發生在重疊的對象之間,則行為未定義。

您需要使用memmov (並提供適當的長度)或者您需要自己移動字符。 如果您首先計算需要刪除的字符,然后一次性復制所有字符,也可以提高性能。

Joop Eggen 在評論中指出的另一個問題:

char *result = "CHEDDAR";

不允許修改字符串文字。 如果您嘗試刪除前導字符,則會調用未定義的行為。

你應該把它改成

char result[] = "CHEDDAR";

由於您的示例字符串不包含前導空格,因此這不會造成麻煩。 但是你應該修復它

這段代碼

strcpy(startingString, startingString + 1);

復制重疊的字符串。

根據7.24.2.3 的 strcpy 函數,C 標准的第 2 段

strcpy函數將s2指向的字符串(包括終止空字符)復制到s1指向的數組中。 如果復制發生在重疊的對象之間,則行為未定義。

您正在調用未定義的行為。

盡管確定您正在復制重疊字符串的答案確定了未定義的行為,但另一個原因是您使用了文字字符串,而在大多數平台上,這些字符串是不可變的,會導致程序中止。

代替:

char *result = "CHEDDAR";

用:

char result[] = "CHEDDAR";

(注意:看看大多數strcpy函數是如何實現的,即在看到源字符串的空字符時終止的循環,那么您使用的重疊仍然會看到源的空字符並將其放入目標(向下復制)。以相反的方式復制(向上復制)將不再看到空終止符,因為它將被覆蓋,並且可能會繼續復制超出目標字符串。)

在您的情況下,不需要修改並且沒有完成分配,您只需要找到開始而不復制任何內容。

char *stripFrontChar(char *startingString, char removeChar) {
    for( ; *startingString == removeChar; startingString++)
        ;
    return (startingString);
}

但是你必須使用stripFrontChar()的返回

printf("%s\n", stripFrontChar(result));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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