2

あなたが持っているとしましょう:

const char * something = "m";

toupper (または該当する場合は他の何か) を使用して、この大文字をどのように作成しますか?

char *a の代わりに 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 LanguageようKernighan & Ritchie5.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, in 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;
}

EDIT: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関数が文字列の文字に適用されます。これは、::toupperC に由来するグローバル名前空間の関数です。std::toupper複数のオーバーロードがあり、::toupperよりエレガントに見えますstatic_cast<int (*)(int)>(&std::toupper)

于 2015-12-29T00:29:18.693 に答える