假设你有:
const char * something = "m";
如何使用toupper(或其他东西,如果适用)制作这个大写字母?
我想使用char *
代替string
(我可以使用字符串,但我必须使用str.c_str()
)。
那么,如何让char * something = "m";
包含"M"
?
答案 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)
更优雅。