簡體   English   中英

從字符串C中刪除字符

[英]Delete chars from string C

因此,我從一本書開始學習C,其中一個練習是創建一個函數,該函數將使用2個字符串,並從第一個字符串中刪除第二個字符串中的字符。

我們隔斷板框沒有學習指針,所以我想沒有它們也是有可能的,但是當我嘗試運行我的代碼時,它就暗戀了。

編碼:

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

char squis(char string[], char sub[])
{
    int i, c;
    char ret_string[strlen(string)];
    int map[strlen(string)];
    for(i=0; i<= strlen(string);i++)
        map[i] = -1;
    for(i=0; i<= strlen(sub);i++)
    {
        while(string[c]!='\0')
        {
            if (string[c]==sub[i])
                map[c] = c;
            c++;
        }
        c=0;
    }
    for(i=0; i<= strlen(string);i++)
    {
        if (map[i]==-1)
            ret_string[c++] = string[i];
    }
    ret_string[c] ='\0';
    return ret_string[0];
}

int main()
{
    char string[] = "string";
    char remove[] = "sasas";
    printf("%s",squis(string,remove));
    return 0;
}

我對C的新手不滿意,所以我認為問題出在我對C的工作方式缺乏了解。

非常感謝您的幫助:-)

更新:看來問題在於函數結尾處的返回。 當我在函數內部打印ret_string時,該函數似乎運行良好(一個錯誤使該函數忽略了子字符串中的第一個字符,但我稍后會處理),但是當我嘗試返回要打印的數組時它在主要功能上失敗了。

有在C中返回數組的特定規則嗎?

這是一個明顯的問題:

int map[strlen(string)];
for(i=0; i<= strlen(string);i++)
    map[i] = -1;

您創建一個由strlen(string)字符組成的數組,然后在數組中初始化strlen(string) + 1字符。 超出數組的范圍寫入會導致未定義的行為 ,這可能會發生任何事情。

將循環條件更改為小於< 您可能應該在所有循環中都這樣做。

ret_string也有類似的問題,這將是您返回的字符串。 最多只能有strlen(string)字符,但是隨后您需要為字符串終止符添加一個字符,因此數組需要為strlen(string) + 1strlen(string) + 1

然后,您會遇到一個問題,即squis函數僅返回單個字符,但是在您的printf調用中,您將此單個字符視為字符串。 這應該使您的編譯器向您發出警告。 如果僅通過返回ret_string解決此問題,則將出現另一種不確定行為的情況 ,因為您隨后將返回一個指向局部變量的指針,該局部變量在函數退出時會超出范圍,因此返回的指針不再有效。 而且,如果您決定在堆上分配ret_string ,則在當前調用中會發生內存泄漏,因為指針不會保存,因此您可以釋放分配的內存。

暫無
暫無

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

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