假设您有:
const char * something = "m";
使用 toupper (或其他东西,如果适用)如何使这个大写?
我想使用 achar *
而不是 a string
(我可以使用字符串,但我必须使用str.c_str()
)。
那么,我怎样才能使char * something = "m";
包含"M"
?
我发现您选择 C 字符串令人不安.. 但无论如何。
您不能更改字符串文字 ( char *something
)。尝试一个数组:
char something[] = "m";
something[0] = toupper(something[0]);
要更改整个字符串:
char something[] = "hello";
char *p = something;
while (*p) {
*p = toupper(*p);
p++;
}
正如在非常著名的 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;
}
希望能帮助到你!
您可以使用与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
都是未定义的行为。
您可以将 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;
}
希望这可以帮助。
你可以这样做:
#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)
.