C++ 删除C字符串中的大写字母

C++ 删除C字符串中的大写字母,c++,C++,编写一个不返回值的函数来删除C字符串中的大写字母 无效擦除(字符*a) { char*targetp=sourcep while (*sourcep != '\0') { if (isupper(static_cast<unsigned char>(a)== false) { *targetp++ = *sourcep; } a++; } *a='\0'; } while(*sourcep!='\0') { 如果(isupp

编写一个不返回值的函数来删除C字符串中的大写字母

无效擦除(字符*a) { char*targetp=sourcep

while (*sourcep != '\0')
{
    if (isupper(static_cast<unsigned char>(a)== false)     
    {
        *targetp++ = *sourcep;
    }
    a++;
}
*a='\0';
}
while(*sourcep!='\0')
{
如果(isupper)(静态_转换(a)=假)
{
*targetp++=*sourcep;
}
a++;
}
*a='\0';
}

如果您删除了一封信,则不应调用它。请使用
else
来实现这一点

否则,您将跳过字母,并且对于有连续大写字母的情况,您的算法将失败


另外,
*p!='\0'
可以简单地缩写为
*p
。这不是每个人都喜欢的,但我就是这么做的。

你不应该每次看到大写字母都复制所有文本。你只需跳过大写字母,一步一步地复制。请参阅下面的解决方案。速度更快

void deleteCapitals(char* sourcep) //a function that only passes
{
    char* targetp = sourcep;

    while (*sourcep != '\0')
    {
        if (!isupper(static_cast<unsigned char>(*sourcep)))     
        {
            *targetp++ = *sourcep;
        }
        sourcep++;
    }
    *targetp='\0';
}
void deleteCapitals(char*sourcep)//只传递
{
char*targetp=sourcep;
而(*sourcep!='\0')
{
如果(!isupper(静态_转换(*sourcep)))
{
*targetp++=*sourcep;
}
sourcep++;
}
*targetp='\0';
}

每当两个大写字母相邻时,您就可以传递给第二个大写字母

@Bathsheba解决方案的另一种选择是使用
while
而不是
if

while (isupper(*a))
{
    for (char* p = a; *p != '\0'; p++)
    {
        *p = *(p + 1);
    }
}

这样,如果重新分配后,
*a
仍然是大写,它会再次执行该操作。

“使用else实现该操作。否则,您将跳过字母”-请永远不要编辑它:DOh,如果我不使用else语句,它也会移位,但有时也会跳过大写字母?@Zach:当然!如果你调试代码并仔细遵循,你应该看到删除一个字符会跳过下一个字符,这都是因为你折叠了字符串。与你的核心问题无关,但是相关的:为了挑剔,你必须用
a
替换两个指针中的一个,因为“只允许一个额外的变量”@coyotte508:我在声明中做了opsite并替换了a,以使其更具可读性这可能会调用UB。请参阅