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

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

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

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

3回答

871閲覧

toupperによる大文字の変換

gren5003

総合スコア1

char

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/23 05:10

前提・実現したいこと

char * str[] = {"aaa", "bbb", "ccc", "ddd"};
という宣言・初期化された配列strをつかって、
AAA
BBB
CCC
DDD
と表示させたい。

(toupper使用)

試したこと

c

1#include <stdio.h> 2#include <ctype.h> 3 4int main() 5{ 6 char * str[] = {"aaa", "bbb", "ccc", "ddd"}; 7 int i; 8 9 for (i = 0; str[i] != '\0'; i++){ 10 *str[i] = toupper(*str[i]); 11 printf("%s", str); 12 printf("\n"); 13 } 14 15 return 0; 16}

上のようなプログラムを作成してみたら、セグメントエラーでした。
私の考えだと、宣言したものが変更不可能であるためセグメントエラーがでたのかなと思います。
宣言・初期化は上のものを使用して、大文字にさせるプログラムをぜひ教えてください。

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

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

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

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

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

YT0014

2020/07/23 05:20

C#とは無関係なので、C#タグを外してください
guest

回答3

0

宣言されているstrの意味を誤解されています。

char * str[] = {"aaa", "bbb", "ccc", "ddd"};

というのは、以下の意味です。

char* str[4];
str[0] = "aaa";
str[1] = "bbb";
str[2] = "ccc";
str[3] = "ddd";

なので、forで用いている、*str[i]は、以下の用になります。

*str[0] = 'a';
*str[1] = 'b';
*str[2] = 'c';
*str[3] = 'd';
*str[4] = ???

iが4以降の場合、どこにアクセスされるかわかりません。
そんな不明なアドレスの値を書き換えに行くのですから、セグメントエラーにもなります。

Cにおける文字列は、単なる配列であり、コード側での配慮が必要だと言う事を忘れないようにしてください。

投稿2020/07/23 05:35

YT0014

総合スコア1750

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

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

0

char * str[]

の宣言では、charのポインタの配列、となってます
文字列定数のアドレスの配列、ということなので、定数は変更することができません
そのため、セグメントエラーとなってます

char str[][8]={なんたら};

でやってみたらどうなるかみてみればどうでしょう

投稿2020/07/23 07:17

y_waiwai

総合スコア88042

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

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

0

宣言・初期化は上のものを使用して、大文字にさせるプログラムをぜひ教えてください。

表示させるだけなら、文字列を変更する必要はないので、

C

1#include <stdio.h> 2#include <ctype.h> 3 4int main(void) 5{ 6 char *str[] = {"aaa", "bbb", "ccc", "ddd"}; 7 8 int length = sizeof(str) / sizeof(char *); 9 10 for (int i = 0; i < length; i++) { 11 for (int j = 0; str[i][j] != '\0'; j++) { 12 putchar(toupper(str[i][j])); 13 } 14 putchar('\n'); 15 } 16 17 return 0; 18}

のようにすればいい。

一方、内容を変更するのであれば、宣言を変更して、

C

1#include <stdio.h> 2#include <ctype.h> 3 4int main(void) 5{ 6 char str[][4] = {"aaa", "bbb", "ccc", "ddd"}; 7 8 int length = sizeof(str) / sizeof(str[0]); 9 10 for (int i = 0; i < length; i++) { 11 for (int j = 0; str[i][j] != '\0'; j++) { 12 str[i][j] = toupper(str[i][j]); 13 } 14 printf("%s\n", str[i]); 15 } 16 17 return 0; 18}

投稿2020/07/23 05:30

Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問