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

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

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

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

Q&A

解決済

1回答

808閲覧

初心者です。C言語のポインタ配列を勉強しているのですが現在のソースコードで間違えている個所を指摘してください。

zero1132

総合スコア4

C

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

0グッド

0クリップ

投稿2023/02/18 09:35

編集2023/02/18 18:51

実現したいこと

scanfで書き込んだ文字を3回表示させたいです。
現状のソースコードではpstr=%が1回しか表示されないです。

前提

ポインタ配列がよくわからないため勉強している最中です。
現状のコードで間違えている個所を指摘してほしいです。

発生している問題・エラーメッセージ

Warningのみ表示されています。

(16,23): warning C4047: '関数': 間接参照のレベルが 'rsize_t' と 'char [100]' で異なっています。 (16,19): warning C4024: 'strcpy_s': の型が 2 の仮引数および実引数と異なります。 (16,37): warning C4047: '関数': 間接参照のレベルが 'const char *' と 'size_t' で異なっています。 (16,25): warning C4024: 'strcpy_s': の型が 3 の仮引数および実引数と異なります。 (27,16): warning C4047: '関数': 間接参照のレベルが 'char **' と 'char *(*)[3]' で異なっています。 (27,12): warning C4024: 'write_str': の型が 1 の仮引数および実引数と異なります。

該当のソースコード

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5int write_str(char **pstr) { 6 int i; 7 char mozi[100]; 8 9 for (i = 0; i < 3; i++) { 10 printf("-----\n"); 11 scanf_s("%s", mozi, 100); 12 *(pstr + i) = (char*)malloc(sizeof(char) * (strlen(mozi) + 1)); 13 strcpy_s(*pstr, mozi, sizeof(mozi)); 14 printf("pstr=%s\n", *pstr); 15 } 16 return 0; 17} 18 19 20int main() 21{ 22 char* str[3]; 23 24 write_str(&str); 25 26 return 0; 27}

試したこと

ループされているか確認したがループされていなかった。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

(※chatGPTによる回答です)
問題の原因は、write_str 関数内でポインタ pstr にアドレスを格納する際、配列要素を指定していないことにあります。配列要素を指定せずにポインタ pstr をインクリメントしてしまうと、異なるアドレスにアクセスすることになり、想定外の動作が発生します。以下は、修正されたコードです。

c

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5int write_str(char **pstr) { 6 int i; 7 char mozi[100]; 8 9 for (i = 0; i < 3; i++) { 10 printf("-----\n"); 11 scanf_s("%s", mozi, 100); 12 *(pstr + i) = (char*)malloc(sizeof(char) * (strlen(mozi) + 1)); 13 strcpy_s(*(pstr + i), strlen(mozi) + 1, mozi); 14 printf("pstr[%d]=%s\n", i, *(pstr + i)); 15 } 16 return 0; 17} 18 19int main() { 20 char* str[3]; 21 write_str(str); 22 return 0; 23}

この修正されたコードでは、write_str 関数内で配列要素を指定して、正しいアドレスを pstr に格納するように修正されています。また、strcpy_s 関数の引数には、ポインタの指し示す領域のサイズを指定する必要があるため、strlen(mozi) + 1 となっています。さらに、printf文の表示も配列要素を指定するように修正されています。

投稿2023/02/18 09:41

編集2023/02/18 09:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

zero1132

2023/02/18 09:50

解決し理解できました。 迅速な回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問