在C ++中转换为大写

时间:2012-01-01 15:59:37

标签: c++ string uppercase toupper

假设你有:

const char * something = "m";

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

我想使用char *代替string(我可以使用字符串,但我必须使用str.c_str())。

那么,如何让char * something = "m";包含"M"

5 个答案:

答案 0 :(得分:6)

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

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

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

要更改整个字符串:

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

while (*p) {
    *p = toupper(*p);
    p++;
}

答案 1 :(得分:4)

对于原始数组,您可以使用与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的任何元素是未定义的行为。

答案 2 :(得分:4)

正如着名的C书中所解释的那样 - The C Programming Language Kernighan & 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;
}

希望它有所帮助!

答案 3 :(得分:1)

您可以将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;
}

希望这有帮助。

答案 4 :(得分:0)

你可以这样做:

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

char test[] = "m";

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

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