2

假设您有:

const char * something = "m";

使用 toupper (或其他东西,如果适用)如何使这个大写?

我想使用 achar *而不是 a string(我可以使用字符串,但我必须使用str.c_str())。

那么,我怎样才能使char * something = "m";包含"M"

4

5 回答 5

7

我发现您选择 C ​​字符串令人不安.. 但无论如何。

您不能更改字符串文字 ( char *something)。尝试一个数组:

char something[] = "m";
something[0] = toupper(something[0]);

要更改整个字符串:

char something[] = "hello";
char *p = something;

while (*p) {
    *p = toupper(*p);
    p++;
}
于 2012-01-01T16:00:33.143 回答
5

正如在非常著名的 C 书籍中所解释The C Programming LanguageKernighan & Ritchie那样5.5 Character Pointers and Functions

char amessage[] = "now is the time";    /* an array */
char *pmessage = "now is the time";     /* a pointer */

`amessage` is an array, just big enough to hold the 
sequence of characters and `'\0'` that initializes it. 
Individual characters within the array may be changed 
but `amessage` will always refer to the same storage. 
On the other hand, `pmessage` is a pointer, initialized 
to point to a string constant; the pointer may subsequently 
be modified to point elsewhere, but the result is undefined
if you try to modify the string contents.

OTOH,在C语言中,要转换成大写字母,可以参考下面的程序。

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int i=0;
    char str[]="Test String.\n";
    char c;

    while (str[i]) {
        c=str[i];
        putchar(toupper(c));
        i++;
    }

    return 0;
}

在 C++ 中

#include <iostream>
#include <string>
#include <locale>
using namespace std;

int main ()
{
    locale loc;

    string str="Test String.\n";

    for (size_t i=0; i<str.length(); ++i)
        cout << toupper(str[i],loc);

    return 0;
}

编辑:为 C 版本添加指针版本(按@John 的要求)

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int i=0;
    char str[]="Test String.\n";
    char *ptr = str;

    while (*ptr) {
        putchar(toupper(*ptr));
        ptr++;  
    }   

    return 0;
}

希望能帮助到你!

于 2012-01-01T16:21:52.340 回答
5

您可以使用与std::string原始数组相同的算法方法:

char s[] = "hello world";
std::transform(s, s + std::strlen(s), s, static_cast<int(*)(int)>(std::toupper));

出于显而易见的原因,您不能对不可变的字符串文字(如const char * s = "hello world;")执行此操作,因此您不会为此进行额外的分配/复制。

更新:正如 Ildjarn 在评论中所说,重要的是要注意字符串文字始终是只读的,即使由于历史原因,您可以将它们绑定到可变指针,例如char * s = "hello world";. 如果您尝试这样做,任何体面的 C++ 编译器都应该给您一记耳光,但它是有效的 C++——但任何实际修改任何元素的尝试s都是未定义的行为。

于 2012-01-01T16:04:43.487 回答
2

您可以将 C-string 转换为 std::string,然后使用 boost::to_upper 原地更改字符串或使用 boost::to_upper_copy 创建字符串的大写副本。这是代码示例:

#include <iostream>
#include <boost/algorithm/string/case_conv.hpp>

int main ()
{
  char const * s = "Test String.\n";
  std::string str(s);

  std::cout << boost::to_upper_copy(str).c_str() << std::endl;

  return 0;
}

希望这可以帮助。

于 2012-01-01T18:43:52.687 回答
1

你可以这样做:

#include <algorithm>
#include <iterator>
#include <ctype.h>

char test[] = "m";

std::transform(std::begin(test), std::end(test), std::begin(test), ::topper);

这会将::toupper函数应用于字符串的字符。这是::toupper来自 C 的全局命名空间中的函数。std::toupper有多个重载,::toupper看起来比static_cast<int (*)(int)>(&std::toupper).

于 2015-12-29T00:29:18.693 回答