質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

869閲覧

C++の文字列について

MAMOMIMOMU

総合スコア13

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/24 05:47

以下は入力した文字列を全て大文字にして出力する
プログラムです。

C++

1#include<iostream> 2#include<cctype> 3using namespace std; 4 5void put_upper(const char* s){ 6 7 for (int i = 0; s[i]; i++){ 8 cout << static_cast<char>(toupper(s[i])); 9 } 10} 11 12int main(){ 13 char str[36]; 14 cout << "Whats your name? : "; cin >> str; 15 put_upper(str); 16}

C++において文字列はconst char型の配列
であるそうですが、
toupper関数というのは

C++

1void my_toupper(char *str) 2{ 3 while( *str != '\0' ) { 4 if( *str >= 'a' && *str <= 'z' ) 5 *str += 'A' - 'a'; 6 ++str; 7 } 8}

こんな感じにポインタによって、もともとの文字列の各要素を
変更してしまっています。これは文字列の各要素がconst char型であることに
矛盾するような気がするのですが、どういうことなのでしょうか。
回答お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/01/24 06:01 編集

誤記抹消・・・失礼
LouiS0616

2020/01/24 06:11

toupper関数の引数は文字では?charポインタは取らないと思いますが。
guest

回答5

0

ベストアンサー

toupper関数の引数はintです

int toupper( int c /* int 型の文字 */ );

ですから、strの中身をいじっているのではなく、1文字ずつ別の変数にコピーして出力しています
その証拠に、put_upperを通した後、strの中身を表示しても、元の文字列のままのはずです

my_toupper の認識が間違っているし、
my_toupper の引数を const char *str に変えればコンパイルエラーが出ます

投稿2020/01/24 07:02

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MAMOMIMOMU

2020/01/25 02:08

回答ありがとうございます。2番目に私が持ち出したコードは、1番目で使われている大文字変換の関数とは内容が異なりますね。const char*で渡された文字列は、その内容の変更は不可能だけれども、そもそも文字列リテラルをtoupperに渡し内容を変更しているわけではないからなんの問題もないということですね。
guest

0

void put_upper(const char* s){

この場合のconst は、s自身にかかってます
sの指し先は変更可能ですね

投稿2020/01/24 05:54

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2020/01/24 06:52

えっと、それは誤りです。 s自身をconst修飾する場合は、 「char* const s」です。
guest

0

こんにちは。

C++において文字列はconst char型の配列

それは誤りですよ。文字列定数を const char*で受けることはありますが、文字列は char* で受け取ります。
ですので、my_toupper("abc");はコンパイル・エラーになりますが、char str[]="abc"; my_toupper(str);はエラーになりません。前者は文字列定数を直接my_toupperへ渡そうとしています。文字列定数は変更できませんのでエラーになります。後者は文字列定数を文字配列型変数へ放り込んでからmy_toupperへ渡しているのでエラーになりません。

ところで、C++では、std::string を使えるので、std::stringを使うことも多いです。(長さが変わるような加工をする場合は特に)

投稿2020/01/24 06:59

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんな感じにポインタによって、もともとの文字列の各要素を

変更してしまっています。これは文字列の各要素がconst char型であることに
矛盾するような気がするのですが、どういうことなのでしょうか。

ポインタ変数自体も各要素の値も変更ができない型は
const char*ではなくconst char* constですね。

投稿2020/01/24 06:21

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2020/01/24 05:54

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問