簡體   English   中英

從C中的字符串中刪除字符

[英]Removing a character from a string in C

所以我正在做一個關於函數/字符/指針的紙質問題。 我在代碼中遇到問題,需要幫助來理解它。

更具體地說,我在問題B)ii)中遇到問題,這要求我從字符串中刪除冒號。

我的想法是取字符串,做一個指針並直接指向冒號,然后用繼續它的下一個字符替換此冒號。 然后用冒號前面的字符替換冒號后面的其他字符,直到達到NULL。

在編譯時,它可以編譯,但是給我分段錯誤:11。這是怎么回事? 我怎樣才能解決這個問題? 有我不明白的東西嗎? 謝謝。

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


int locate_colon(char* x) //Question B) i)
{
    int i = 0;
    while(*x != '\0')
    {
        if(*x == ':')
        {
            return i;
        }
        i++;
        x++;
    }
    return -1;
}

char* remove_colon(char* x) //Question B) ii)
{
    int y,i,j;
    y = locate_colon(x);
    i =0;
    j =1;
    while(*x != '\0')
    {
        x[y+i] = x[y+j];
        i++;
        j++;
    }
    return x;
}

int main() //Testing if functions work by running through compiler
{
    int x;
    char colon[] = "Colon: 123";
    char* colonptr;
    colonptr = colon;
    x = locate_colon(colonptr);
    printf("%d",x);

    //B) ii)
    char* y;
    y = remove_colon(colonptr);
    while(y != '\0')
    {
        printf("%s",y);
        y++;
    }
    return 0;
}

您在remove_colon()循環應為:

while(x[y+i] != '\0')
{
    x[y+i] = x[y+j];
    i++;
    j++;
}
x[y+i]= '\0';

while(y != '\0')
{
    printf("%s",y);
    y++;
}

應該只是:

printf("%s",y);

或其他選擇:

printf("%s",colonptr);

@Giorgi在他現在刪除的答案中指出了您的代碼片段,該片段是有效的C語言,但還是很錯誤的:

while(y != '\0')
{
    printf("%s",y);
    y++;
}

變量y是指向char的指針,因此while (y != '\\0')等效於while (y != NULL) ,有些人希望將其寫為while (y) C沒有定義增加非null指針將產生null指針的任何方式,因此,如果以其他方式定義了良好的行為,則此循環將永遠不會退出。

但是,實際上,循環的主體取消了y的引用(間接通過printf() )並對其進行遞增。 在進行太多迭代之前, y會指向分配給它最初指向的對象的內存之外,此后,解引用該對象的行為是不確定的。 分割錯誤是這種特定類型的UB的常見觀察結果。

我懷疑您打算寫while(*y != '\\0') ,但這仍然很奇怪,因為您最終將打印出字符串的尾部序列,而似乎只想打印一個字符串。 在那種情況下,我不清楚您為什么在這里使用循環。 簡單有什么問題

printf("%s",y);

當然,正如注釋中指出的那樣,這並不是代碼唯一的問題,但它可能解釋了作為實際問題主題的分段錯誤。

暫無
暫無

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

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