如何对字符串作为指针执行大写转换

How do I perform an upper-case conversion on strings as pointers

本文关键字:执行 转换 指针 字符串      更新时间:2023-10-16

我正在修改一些用C++编写的现有代码,这些代码使用字符串指针,但很难理解为什么我在使用 toupper(( 函数时遇到如此多的困难,或者将 ASCII 值减少 32 来执行大小写转换。 我已经成功地实现了我想要的,用最少的C++知识,但我想改进当前的代码,为了简单地证明一个技术点,它包含字母表中每个字母的 if 条件。

除了我难以掌握C++语法和规则之外,我的尝试可以按照我的意愿正常工作。

现有代码对"buf"的定义如下:

static void c_write(Ldisc ldisc, const char *buf, int len)
{
from_backend(ldisc->frontend, 0, buf, len);
}

然后,我为字母表中的26个字母中的每一个添加了以下内容,以证明我的观点。

if (buf[0] == 97)  buf="A";
if (buf[0] == 98)  buf="B";
if (buf[0] == 99)  buf="C";
if (buf[0] == 100) buf="D";

。等等等等。

如果我将我的 26 个条件替换为以下内容,则编译失败。

if (buf[0]>=97 && buf[0]<=122)
{
buf[0]=buf[0]-32;
}

消息是"(376(:错误 C2166:l 值指定常量对象">

我也尝试使用 toupper(( 函数,但在那里得到了不令人满意的结果,要么使例程崩溃,要么返回一个虚假值。

为了帮助理解使用 buf[] 的上下文,现有代码包含以下工作部分。

switch (buf[0]) {
case CTRL('M'):
if (ldisc->protocol == PROT_TELNET && ldisc->telnet_newline)
ldisc->back->special(ldisc->backhandle, TS_EOL);
else
ldisc->back->send(ldisc->backhandle, "r", 1);
break;
case CTRL('?'):
case CTRL('H'):
if (ldisc->telnet_keyboard) {
ldisc->back->special(ldisc->backhandle, TS_EC);
break;
}
case CTRL('C'):
if (ldisc->telnet_keyboard) {
ldisc->back->special(ldisc->backhandle, TS_IP);
break;
}
case CTRL('Z'):
if (ldisc->telnet_keyboard) {
ldisc->back->special(ldisc->backhandle, TS_SUSP);
break;
}
default:
ldisc->back->send(ldisc->backhandle, buf, len);
break;

问题很简单,在这个

static void c_write(Ldisc ldisc, const char *buf, int len)

const承诺不修改buf指向的字符串。因此,显然不允许尝试将其转换为大写。这就是您的错误"(376(:错误 C2166:l 值指定 const 对象">试图告诉您的。

(明显(目的是编写字符串的函数不会修改该字符串似乎是合理的。因此,如果您需要转换为大写,我会说正确的位置是在您调用c_write之前,而不是作为c_write的一部分。