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

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

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

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

Q&A

解決済

5回答

1157閲覧

Segmentation faultを解決したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2021/11/22 09:28

編集2021/11/22 10:05

写真の問題を解くようなプログラムを作ったのですが、長い文字列(具体的には26文字以降)を入力するとエラーが出てしまいます。どのように解決したらよろしいでしょうか?
文字列の長さおよび配列のサイズをあらかじめ指定することは許されていません。

イメージ説明

#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { int i, len; char *str, *word, cp; printf("Input An English word > "); scanf("%s", word); len = strlen(word); str = (char *)malloc(len * sizeof(*str)); strcpy(str, word); for(i=0; i<(len/2); i++) { cp = str[i]; str[i] = str[len-i-1]; str[len-i-1] = cp; } printf("%s\n", str); return 0; }
---execution results --- $ ./test Input An English word > dfjahdfhkjhdjkhfkhakjhdkjfhas Segmentation fault (core dumped) $ ./test Input An English word > adhfkjhakhdjkhfkjahskjdhjfk Segmentation fault (core dumped) $ ./test Input An English word > fakjdlkfhkljahsjkdhfkhalsd Segmentation fault (core dumped) $ ./test Input An English word > fajkhdkhfkjahskjdhfkjhaks skahjkfhdjkshajkfhkdhkjaf $ ./test Input An English word > fhakdjhfkjhakjsdhfkjhskjh hjkshjkfhdsjkahjkfhjdkahf $ ./test Input An English word > flkdhfhakjhdkjfhkajhdkjfh hfjkdhjakhfjkdhjkahfhdklf

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

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

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

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

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

guest

回答5

0

ベストアンサー

(うっわ、めちゃくちゃめんどくさいやつだこれ…初学者にやらせる内容じゃないだろこれ…)

おっと失礼、心の声が漏れてました。さて本題ですが、いくつかの手順に分けて考えましょう。

  1. 可変長の長さの文字列を読み取る

ファイルからの読み込みであれば、事前に長さを調べる方法がありますが、今回はキーボードからなので無理です。環境によっては、scanf関数のオプションで領域を自動確保することもできますが、標準の機能ではないです。

→ 何回かに分けて文字列を読み込んで、それを連結させることを考える。

  1. メモリ確保の方法

malloc関数で確保して、領域が足りなくなったらrealloc関数で継ぎ足しましょう。それで足りなくなったら…諦めましょう(異常終了も、合理的な選択肢です)。

  1. 文字列連結

領域を継ぎ足して、継ぎ足した領域に直接読み込めば、連結のことは考えなくてよさそうです。

というわけで、ヒントをば。(答えそのものではないですよ?)

#include <stdio.h> #include <string.h> #include <stdlib.h> char* gets_a(void) { size_t len = 512, read = 0; char* str = (char *)malloc(len * sizeof(*str)); char* temp; while(str){ str[len-2] = '\0'; fgets(str + read, len - read, stdin); if(str[len-2] == '\n' || ​str[len-2] == '\0'){ ​str[len-2] = '\0'; ​return realloc(str, read + strlen(str + read) + 1)); ​} ​read = len - 1; ​len *= 2; ​temp = (char *)realloc(str, len * sizeof(*str)); if(!temp){ free(str); } str = temp; ​} ​return NULL; }

投稿2021/11/22 15:43

majiponi

総合スコア1722

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

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

0

scanf("%s", word);

wordには何が入ってるのか考えてみる。
ここでメモリ破壊が起こっている。これをどーにかしよう

投稿2021/11/22 11:11

y_waiwai

総合スコア88042

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

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

0

あ、あいきゃんとすぴーくいんぐりっしゅ。

可変長配列というのが狭義の int a[n]; のことだけであれば、それに相当するモノを作れば良いのではないでしょうか。

投稿2021/11/22 10:59

jimbe

総合スコア13209

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

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

0

The pointer variable word has not been initialized.
Therefore, it is unknown where this variable points.
Nevertheless, you are using this for scanf().


If you can't make any assumptions about input length, you'll need to pick up dynamically the typed characters and find the word length, I think.

Following sample code is simple one.
It checks each input character one by one until it finds the end of a word.

C

1int main(void) 2{ 3 unsigned int WordLength = 0; 4 5 while( 1 ) 6 { 7 char c = fgetc( stdin ); 8 if( !isalpha(c) )break; 9 10 ++WordLength; 11 12 //You can add any code here. 13 //e.g. any work releated to memory allocation to remember the input characters. 14 } 15 16 printf( "WordLength = %d\n", WordLength ); 17 return 0; 18}

投稿2021/11/22 10:33

fana

総合スコア11996

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

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

0

scanf("%s", word);

scanf doesn't allocate memory automatically.

投稿2021/11/22 09:41

yumetodo

総合スコア5852

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問