C 字符串在 C 和 C++ 中变为大写

C string to uppercase in C and C++

本文关键字:C++ 字符串      更新时间:2023-10-16

当我在C++中将一个大写函数放在一起时,我注意到我没有收到 C 的预期输出。

C++功能

#include <iostream>
#include <cctype>
#include <cstdio>
void strupp(char* beg)
{
    while (*beg++ = std::toupper(*beg));
}
int main(int charc, char* argv[])
{
    char a[] = "foobar";
    strupp(a);
    printf("%sn", a);
    return 0;
}

按预期输出:

FOOBAR


C 函数
#include <ctype.h>
#include <stdio.h>
#include <string.h>
void strupp(char* beg)
{
    while (*beg++ = toupper(*beg));
}
int main(int charc, char* argv[])
{
    char a[] = "foobar";
    strupp(a);
    printf("%sn", a);
    return 0;
}

输出是预期结果,缺少第一个字符

OOBAR

有谁知道为什么在用 C 编译时结果会被截断?

问题是中没有序列点

while (*beg++ = toupper(*beg));

所以我们有未定义的行为。 在这种情况下,编译器正在做的是在toupper(*beg) C 之前评估beg++,而在 C 中,C++它以另一种方式进行。

while (*beg++ = std::toupper(*beg));

导致未定义的行为。

*beg++是在std::toupper(*beg)之前还是之后排序的,没有具体说明。

简单的解决方法是使用:

while (*beg = std::toupper(*beg))
   ++beg;

while (*beg++ = toupper(*beg));

包含对使用两次的实体的副作用。你无法知道 beg++ 是在 *beg 之前还是之后执行的(在 toupper 内部(。您很幸运,两种实现都显示了这两种行为,因为我很确定C++也是如此。(但是,c++11 有一些规则更改,我不确定 - 尽管如此,它仍然是糟糕的风格。

只需将乞丐++移出条件:

while (*beg = toupper(*beg)) beg++;

关于上面的答案,'f' 永远不会在函数内部传递,你应该尝试使用这个:

     while ((*beg = (char) toupper(*beg))) beg++;