如何从字符串中的一组字符中去除前导字符?

时间:2014-10-15 11:00:33

标签: c string char

我需要从C中的字符串中删除一组字符。

str = "01 ",然后:

  1. "112345"输出应为"2345"
  2. "0 78abc"输出应为"78abc"
  3. " 7777"输出应为"7777"
  4. 我希望你能借助这些例子来理解。

    功能格式为:

    char* StripLeadingChars(char* str, char* originalString)
    

    编辑: 我很抱歉没有详细说明代码。我试过编码,下面是我的代码。

    char* StripLeadingChars(char* str, char* originalString)
    {
        for(int i=0;i<strlen(str);i++)
        {
            for(int j=0,k=0;j<=strlen(originalString);j++)
            {
                if(originalString[j]!=str[i])
                    originalString[k++] = originalString[j];
            }
        }
        return originalString;
    }
    

    但是这段代码会删除originalString中str的所有字符,如下所示。

    str = "01 "

    originalString="11230 45"

    输出为"2345",而所需输出为"230 45"

    请帮我纠正我的代码。谢谢!

4 个答案:

答案 0 :(得分:0)

也许尝试完成此代码:

char *stripLeadingChars(char* str, char* originalString) {
    while(originalString is not ended && first char of originalString belongs to str) {
        advance originalString;
    }
    return the string pointed by originalString;
}

对于测试“属于...”,如果该字符没有出现在strchr(str, first character of originalString)中,我建议使用NULL返回str(即假)。

答案 1 :(得分:0)

你不应该在循环中使用strlen() - here's why

你已经尝试了一些东西 - 没关系。这是一个可能的解决方案:

#include <string.h>

char* StripLeadingChars(char* str, char* orig) {
    while (strchr(str, *orig) != NULL) {
        ++orig;
    }
    return orig;
}

工作原理:它检查orig开头的字符是否在str字符串文字中。如果是这样,它将转到orig的下一个字符。如果没有,它将停止检查并返回orig指针。

答案 2 :(得分:0)

挑战在于处理所有案例,包括测试用例不匹配案例和所有匹配案例。以下是满足所有条件的尝试。 (如果所有字符都与strip个字符匹配,则返回NULL)注释以内联方式提供:

#include <stdio.h>

char *StripLeadingChars (char *strip, char *string)
{
    int prefix = 0;     /* simple flag to test if in leading part of string */
    char *p = string;
    char *s = strip;

    if (!p) {
        fprintf (stderr, "%s() error: invalid string.\n", __func__);
        return NULL;
    }

    while (*p)                              /* for every character in string        */
    {
        while (*s)                          /* test each character in strip         */
        {
            while (*p == *s || *p == ' ') { /* string char matches strip or space   */
                p++;                        /* increment sting pointer              */
                prefix = 1;                 /* flag char matched                    */
            }
            s++;                            /* increment strip pointer              */
        }

        if (!prefix)                        /* break on first non-match of strip    */
            break;

        prefix = 0;                         /* reset toggle                         */
    }

    return (*p) ? p : NULL;                 /* if p valid, return p, else NULL      */
}

int main (int argc, char *argv[]) {

    if (argc < 3 ) {
        fprintf (stderr, "Error: insufficient input, usage: %s <strip> <string>\n", argv[0]);
        return 1;
    }

    printf ("\nInput:\n\n  string : %s\n\n  strip  : %s\n\n", argv[2], argv[1]);

    printf ("\nstripped : %s\n\n", StripLeadingChars (argv[1], argv[2]));

    return 0;
}

<强>建立/运行:

gcc -Wall -Wextra -o bin/stripld stripleading.c

./bin/stripld 01 112345

Input:

  string : 112345

  strip  : 01

stripped : 2345

./bin/stripld 01 "0 78abc"

Input:

  string : 0 78abc

  strip  : 01

stripped : 78abc

./bin/stripld 01 "  7777"

Input:

  string :   7777

  strip  : 01

stripped : 7777

./bin/stripld 01 "23 456"

Input:

  string : 23 456

  strip  : 01

stripped : 23 456

./bin/stripld 01 "00 11"

Input:

  string : 00 11

  strip  : 01

stripped : (null)

答案 3 :(得分:-1)

函数char * strcpy ( char * destination, const char * source );可用于实现此目的。

要切断前两位数,请将其用作strcpy (&destination, &source[2]); 这将复制到目标字符串,源字符串从索引为[2]的索引提供的任何字符开始。见例子

int main(void) {

  char str1[]= "012345";
  char str3[10];

  strcpy ( str3, &str1[2] );

  puts (str1);
  puts (str3);

    return 0;
}

输出是:

012345
2345

来源:http://www.tutorialspoint.com/c_standard_library/c_function_strcpy.htm