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

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

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

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

Q&A

解決済

1回答

1713閲覧

<C言語>mallocで確保しているサイズよりも、かなり少ないサイズの文字列しか格納できない

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2020/06/05 16:41

前提・実現したいこと

1行目で抽出をトライする回数(変数名count)
2行目で抽出したい文字列(テストケースだとaiueo)
3行目以降は変数count分だけ改行区切りで文字列が入力されるので
2行目で指定された文字列が入っていれば、その文字列をそのまま出力する
仮に全ての行で指定文字列を含む文字列が入力されなければ
最後にNOと出力する

できないこと

mallocで確保したサイズ範囲内に、ちゃんと文字列を格納したい、けどできない
下記のコードで実行すると

mallocで約100バイト確保しているつもりなのですが(一応確認したところ、104バイトのサイズでした)

fgets(target_of_extraction,sizeof(target_of_extraction),stdin);

この部分で入力できる文字列は7文字まで切れてしまいます
この理由と解決方法を知りたいです

実現したいこと:1行で最大100文字まで入力できるようにサイズを設定したいです

テストケース

1
aiueo
aiueokakikukeko

### 実行すると
1
aiueo
aiueokakikukeko

aiueoka(7文字までしか入らない?)

### 書いたコード

#include<stdio.h> #include<string.h> #include<stdlib.h> #define LIMIT 102 int main(void){ char buf[LIMIT]={0}; //標準入力用 100文字まで int count;//文字列を入力する回数 fgets(buf,sizeof(buf),stdin); sscanf(buf,"%d",&count); int count_count = 0; char extraction_token[LIMIT]; //抽出する対象文字列 fgets(buf,sizeof(extraction_token),stdin); sscanf(buf,"%s",extraction_token); char *target_of_extraction = (char *)malloc(sizeof(char) * 102); //抽出元となる文字列を格納する用 1行に入力できるのは100文字まで for(int i = 0;i < count;i++){ fgets(target_of_extraction,sizeof(target_of_extraction),stdin); if(strstr(target_of_extraction,extraction_token) != NULL){ puts(target_of_extraction); }else{ strcpy(target_of_extraction,"No"); count_count++; if(count_count == count){ puts(target_of_extraction); } } } return 0; }

■■な機能を実装中に以下のエラーメッセージが発生しました。

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

特になし

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

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

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

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

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

guest

回答1

0

ベストアンサー

fgets(target_of_extraction,sizeof(target_of_extraction),stdin);

target_of_extractionはポインタなので、sizeof(target_of_extraction)はポインタのサイズ(8)です。

mallocで確保したサイズはsizeofでは取得できません

投稿2020/06/05 16:49

y_waiwai

総合スコア88024

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

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

退会済みユーザー

退会済みユーザー

2020/06/05 16:53

ありがとうございます! ということは char *target_of_extraction = (char *)malloc(sizeof(char) * 102); こう書いても、102サイズが確保されるわけでなく 8サイズしか確保されていないということでしょうか?
退会済みユーザー

退会済みユーザー

2020/06/05 16:54

あ、そういうことじゃないですね
y_waiwai

2020/06/05 16:55

いや、それで102バイト確保されます そのあとのfgetsで、8バイト上限とされてしまいます
退会済みユーザー

退会済みユーザー

2020/06/05 16:55

char *target_of_extraction = (char *)malloc(sizeof(char) * 102); こう書くと、102バイト確保されるのは、間違ってないでしょうか
y_waiwai

2020/06/05 16:56

間違ってません
退会済みユーザー

退会済みユーザー

2020/06/05 17:02

そうなると、fgetsで文字列を入力すると どんなケースでも 8バイトまでしかとってこれないってことですか? 他の入力方法を選んだ方がいいですか? もしfgets関数で100文字入力できる方法があったり もしくは他の関数の方がいいよっていうのがあれば 簡単でいいのでヒントをいただけないでしょうか
退会済みユーザー

退会済みユーザー

2020/06/05 17:06

あ、なんとなくわかりました sizeofのところが違うんですね!
y_waiwai

2020/06/05 17:09

mallocとおなじ、sizeof(char) * 102 と書いてください
y_waiwai

2020/06/05 17:09

配列であれば、sizeof(配列名)で、配列のサイズが取れます
退会済みユーザー

退会済みユーザー

2020/06/05 17:12

fgets(target_of_extraction,sizeof(char) * 102,stdin); 問題なく入力できました! 遅い時間に本当にありがとうございます 勉強になりました
episteme

2020/06/06 00:44

[余計なお世話] 言語規格により sizeof(char) は必ず1なので省略可
kazuma-s

2020/06/06 01:18

[余計なお世話] 言語規格により (char *)malloc のキャスト (char *) は省略可。 C では、void * はどんなポインタにも暗黙の変換可能。 ソースファイルの拡張子を .c にしていなくて C++ でコンパイルしていればエラーになります。
退会済みユーザー

退会済みユーザー

2020/06/06 11:39

お二方ありがとうございます ちなみにどっちも省略可ということは、書かない方がいいですか? それとも書いた方がいいはいいですか?
y_waiwai

2020/06/06 11:41

まあ、あくまで省略可、という程度のものなので、書いておいたほうがいいっちゃーいいでしょうね
退会済みユーザー

退会済みユーザー

2020/06/06 12:30

承知しました! 書く癖つけときます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問