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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

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

Q&A

解決済

3回答

9335閲覧

2次元配列の文字列をポインタで扱う問題です

TK0107

総合スコア11

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

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

0グッド

0クリップ

投稿2017/05/29 13:11

Shiftleftという関数を用いて、各文字列を左に一文字ずらし、先頭の文字を一番後ろにくっつけるという課題なんですが、

C

1#include<stdio.h> 2 3void shiftleft(char (*str)[16] , int n){ 4 5 int a , b = 0 , c ; 6 char tmp; 7 for(a = 0 ; a < n ; a++){ 8 while((*str[b]) != '\0'){ 9 b++; 10 } 11 tmp = (*str[0]); 12 for(c = 0 ; c < b ; c++){ 13 (*str[c]) = (*str[c]) + 1 ; 14 } 15 (*str[b-1]) = tmp; 16 b = 0; 17 str++; 18 } 19} 20 21int main(){ 22 int i ; 23 int j; 24 char str2[4][16] = {"Tokyo" , "Osaka" , "Fukuoka" , "Nagoya" }; 25 26 printf("文字列を出力します\n") ; 27 for(i = 0 ; i < 4 ; i++){ 28 printf("%s\n" , str2[i] ); 29 } 30 31 j = sizeof(str2) ; 32 printf("配列の大きさは%dバイトです。\n" , j); 33 34 35 shiftleft(str2 , 4); 36 37 38 printf("文字列を出力します\n") ; 39 for(i = 0 ; i < 4 ; i++){ 40 printf("%s\n" , str2[i] ); 41 } 42 43 return 0; 44 45} 46

出力結果を見ると、そもそも文字列をずらすことすらできていません。
2次元配列をポインタで渡した時の操作があまり理解できてないのでご協力をお願いしたいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

こんにちは。

char (*str)[16]は、char型16個の配列へのポインタです。
i番目の文字は、(*str[i])ではなく(*str)[i]です。

*演算子と[]演算子では[]演算子の方が優先順位が高いため、(*str[i])と記述すると、*(str[i])と解釈されます。

例えば、i=1の時、strはchar型16個の配列へのポインタですから、str[1]は次のchar型16個の配列へのポインタとなります。つまり、str[0]が指すところの16バイト先を指してしまいます。

この考え方で数カ所修正するば仕様通り動作するようです。
あともう少しのようですので頑張って下さい。

投稿2017/05/29 14:17

Chironian

総合スコア23272

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

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

TK0107

2017/05/30 04:08

ありがとうございました!!
guest

0

コードを見ると混乱しているように見えるので、こんな感じにすると分かり易いかなと思って。参考までに。

void shiftleft_2(char str[][16], int n) { int i = 0; printf("str[][16]と書いても\n"); printf("引数で渡すとこんな感じ^^ --> %d\n", sizeof str); // (*str)[16]と同じですが、分かり易いかなと^^、 printf("%c \n", str[0][0]); printf("%c \n", str[1][0]); printf("%c \n", str[2][0]); printf("%c \n", str[3][0]); // mainの方で使っているコードですが for (i = 0; i < n; ++i) { // str[0]からstr[3]はchar[16]の変数名、配列の変数名は。。。 printf("%s \n", str[i]); } }

投稿2017/05/29 22:09

kyunta

総合スコア350

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

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

TK0107

2017/05/30 04:02

回答ありがとうございます。 今回は課題が文字列をポインタとして扱うことが条件なので、文字列を直接触るのはダメみたいです・・・ すみません
guest

0

b番目の文字は

(*str[b]) → (*str)[b]

投稿2017/05/30 04:09

TK0107

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問