繁体   English   中英

如何仅使用指针和指针算术删除c中所有出现的字母。

[英]How do I remove all occurrences of a letter in c, only using pointer and pointer arithmetic.

我需要编辑此代码的帮助,以删除单个字符数组中任何出现的特定字母(由用户定义)的情况。 到目前为止,这是我的代码。

void removeLetter(char string[STRING_LENGTH], char letterToBeRemoved)
{
    char *p1 = string;
    size_t length = strlen(string);
    for (int i = 0; i < length-1; i++)
{
    if (*p1 = letterToBeRemoved)
    {
        for (int j = 0; j < length; j++)
        {
            *p1 = *(p1 + 1);
        }
    }
    ++p1;
 }
}

不知道是什么问题? 这与Java不同吗?从某种意义上说,您找到字母然后将所有字母向下移动一个。 我是c语言的新手,这对我来说很难。 谢谢

更快的解决方案使一遍复制您需要的数组中的backword,实际上覆盖了要删除的字母。

#include <iostream>
using namespace std;

const size_t STRING_LENGTH = 12;

void removeLetter(char* string, char letterToBeRemoved)
{
    // pBack will look at each letter in the array 
    // and copy only valid letters to pFront
    // pFront is incremented only when valid letters are copied to it.
    char* pBack = string;
    char* pFront = string;
    while ((pBack - string) < STRING_LENGTH)
    {
        if (*pBack != letterToBeRemoved)
        {
            *pFront = *pBack;
            pFront++;
        }
        pBack++;
    }

    // Terminate string if we removed something
    if ((pBack - string) != (STRING_LENGTH - 1))
    {
        *pFront = '\0';
    }


}

int main() {
    char input[STRING_LENGTH] = "hello world";
    removeLetter(input, 'l');
    std::cout << input << std::endl;
    return 0;
}

在这里查看: http : //ideone.com/t3Obxw

您想要平等,而不是分配:

if (*p1 == letterToBeRemoved)
//       ^

您不需要O(n ^ 2)算法(例如您已经使用内部循环实现)即可。 取而代之的是遍历数组,每次找到要删除的字母时,请增加步长以复制字符。

相反,当源不是特殊char时,遍历数组并更新目标。

void removeLetter(char *string, char letterToBeRemoved) {
  // attempting to remove the null character is pathological.
  assert(letterToBeRemoved);
  char *dest = string;
  do {
    while (*string == letterToBeRemoved) string++;
    *dest = *string++;
  } while (*dest++);
}
#include <stdio.h>

#define STRING_LENGTH 100

void removeLetter(char mystring[STRING_LENGTH], char letterToBeRemoved) {
    char *p1, *p2;
    p1 = p2 = mystring;

    while(*p1 != '\0') {
        if(*p1 != letterToBeRemoved)
            *p2++ = *p1;
        p1++;
    }
    *p2 = *p1;
}

int main() {
    char s[100] = "hi how are you henna.";
    char *p = s;

    while(*p != '\0')
        printf("%c", *p++);
    printf("\n");

    removeLetter(s, 'h');

    p = s;
    while(*p != '\0')
         printf("%c", *p++);
    printf("\n");

    return 0;
}

我使用了两个指针,其中一个指针是简单指针“ p1”,并迭代字符串中的所有字母。 第二个指针“ p2”仅复制不等于“ letterToBeRemoved”的字母。 注意:“ p2”指针始终与“ p1”具有相同的速度或较慢的速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM