代码之家  ›  专栏  ›  技术社区  ›  Mystical

如何筛选C中的用户输入/防止用户键入不需要的字符[重复]

  •  0
  • Mystical  · 技术社区  · 6 年前

    我正试图从C中的字符串中删除一个字符。我的代码存在的问题是它从字符串中删除了该字符的第一个实例,但同时也擦除了字符串中该字符之后的所有内容。例如,从“hello”版画“he”中删除“l”,而不是“heo”

    int i;
    char str1[30] = "Hello", *ptr1, c = 'l';
    ptr1 = str1;
    for (i=0; i<strlen(str1); i++)
    {
        if (*ptr1 == c) *ptr1 = 0;
        printf("%c\n", *ptr1);
        ptr1++;
    }
    

    我需要为此使用指针,并希望尽可能简单,因为我是一个C初学者。 谢谢

    0 回复  |  直到 9 年前
        1
  •  25
  •   Sergey Kalinichenko    13 年前

    你可以这样做:

    void remove_all_chars(char* str, char c) {
        char *pr = str, *pw = str;
        while (*pr) {
            *pw = *pr++;
            pw += (*pw != c);
        }
        *pw = '\0';
    }
    
    int main() {
        char str[] = "llHello, world!ll";
        remove_all_chars(str, 'l');
        printf("'%s'\n", str);
        return 0;
    }
    

    其思想是保持一个单独的读写指针( pr 用于阅读和 pw 对于书写),始终向前移动阅读指针,并且仅当书写指针不指向给定字符时才向前移动。

        2
  •  4
  •   AliA    13 年前

    如果您在适当的位置删除字符,则每次删除字符时,必须将字符串的其余部分向左移动一个位置,这不是非常有效。最好的方法是让第二个数组接受筛选后的字符串。例如,您可以这样更改代码。

    int i;
    char str1[30] = "Hello", *ptr1, c = 'l';
    char str2[30] = {0}, *ptr2;
    ptr1 = str1;
    ptr2 = str2;
    for (i=0; i<strlen(str1); i++)
    {
        if (*ptr1 != c) *ptr2++=*ptr1;
        ptr1++;
    }
    printf("%s\n", str2);
    
        3
  •  2
  •   ristonj    13 年前
    char str1[30] = "Hello", *prt1, c = 'l';
    char str2[30], *prt2;
    prt1 = str1;
    prt2 = str2;
    while(*prt1 != 0)
    {
        if(*prt1 != c)
        {
             *prt2 = *prt1;
             prt2++;  
        }
        prt1++;
    }
    *prt2 = '\0';
    
        4
  •  1
  •   Marlon    13 年前

    问题是当你遇到第一个匹配的角色时 c ,在此处插入一个空字符。这意味着你基本上切断了绳子的其余部分。

    您需要做的是,当您找到匹配的字符时,将以下字符移回一个位置。然后您需要在最末尾插入空字符,这取决于您删除了多少个字符。

        5
  •  1
  •   eightnoteight    11 年前

    我知道这是一种重复的答案,但这段代码是函数解决问题的版本。我认为,由于提问者是一个初学者,他可能从问题的分解版本中学到很多东西。

    int del_x_char(char *p, int x)
    {
        char *q;
        x=first_occurance(p, 'i')/*you can replace any character that you want delete with 'i'*/
        q=p+x;
        while(*q=*(q+1))
            q++;
        *q='\0';
        return 0;
    }
    int first_occurance(char *q, char phar)
    {
        int i=0;
        while(*q)
        {   
            if(*q++==phar)
                return i;
            i++;
        }
        return -1;
    }
    
        6
  •  0
  •   tadeuzagallo    13 年前

    只是改变一下

    if (*ptr1 == c) *ptr1 = 0;
    

    if (*ptr1 == c) continue;
    

    正如@ouah所说,它在第一个空字符处中断。

        7
  •  -1
  •   ouah    13 年前

    C将字符串定义为 “由第一个字符终止并包括第一个字符的连续字符序列。” 空字符