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

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

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

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

Q&A

解決済

3回答

1051閲覧

toupperがうまく機能しない

linkinpark

総合スコア42

C

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

0グッド

0クリップ

投稿2020/07/23 14:43

プログラムを実行するとコアダンプが発生してしまいます。ポインタがうまくいっていないのが原因だと思いますが、どのように
すればよいかわかりませんもしよろしければ教えて下さい。

include <stdio.h>
include<string.h>
include<ctype.h>

void main(){
int i,j;
char *p=NULL;
char *q;
char str[]="hello world";
char *suit[]={"Hearts","Diamonds","Clubs","Spades"};
printf("%p\n","abc");
p="ABC";
printf("%p\n",p);
printf("%c\n",p[0]);
p+=1;
printf("%s\n",p);
p-=1;
printf("%s\n",p);
while(*p!=0){
printf("%c\n",*p);
p+=1;
}
for(i=0;i<strlen(str);i++){
if(str[i]>=97 && str[i]<=122){
str[i]-=32;
}
}
printf("%s\n",str);
for(i=0;i<strlen(suit[i]);i++){
char *s=suit[i];
for(j=0;j<strlen(suit[i]);j++){
s[j]=toupper(s[j]);
}
printf("%s\n",s);
}
}

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

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

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

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

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

guest

回答3

0

ベストアンサー

diff

1- char *suit[] = { "Hearts","Diamonds","Clubs","Spades" }; 2+ char suit[][9] = { "Hearts","Diamonds","Clubs","Spades" };

文字列リテラルは書き換え禁止です。

diff

1- for (i = 0; i < strlen(suit[i]); i++) { 2+ for (i = 0; i< sizeof(suit) / sizeof(suit[0]); i++){

要素数でループ。


suitの書き換えがなぜそのようにするとうまくいくのか

char *suit[] = { "Hearts","Diamonds","Clubs","Spades" };
とした場合、suit[]は書き換え禁止領域に置かれた文字列リテラルへのポインタの配列となります。
よって内容を書き換えようとするとセグメンテーション違反/アクセス違反となります。

char suit[][9] = { "Hearts","Diamonds","Clubs","Spades" };
とした場合、charの二次元配列suit[4][9]に文字列リテラルの内容がコピーされます。
この配列はローカル変数なので書き換え可能です。

投稿2020/07/23 15:37

編集2020/07/25 17:46
SHOMI

総合スコア4079

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

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

linkinpark

2020/07/25 15:37

ありがとうございました!suitの書き換えがなぜそのようにするとうまくいくのか教えていただけないでしょうが?
linkinpark

2020/07/26 05:02

とてもわかりやすい説明ほんとうにありがとうございました!!
guest

0

変えたのですがコアダンプとでてしまいました

投稿2020/07/23 14:58

linkinpark

総合スコア42

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

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

0

c

1for(i=0;i<strlen(suit[i]);i++){

これを

c

1for(i=0;i<sizeof(suit) / sizeof(suit[0]);i++){

こうする。

投稿2020/07/23 14:50

katahiromz

総合スコア186

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

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

linkinpark

2020/07/23 14:59

変えたのですがコアダンプがでてしまいました
SHOMI

2020/07/23 15:30

文字列リテラルは書き換え禁止です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問