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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

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

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

Q&A

解決済

3回答

386閲覧

c言語学習中の学生です。

hoge01

総合スコア17

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

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

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

0グッド

0クリップ

投稿2017/07/02 10:34

###前提・実現したいこと
c言語を学んでいる学生です。
非常に低レベルな質問ですがお願いします。
Windows10でmingwを使っています。

###発生している問題・エラーメッセージ
文字列を入力して、長さと各文字が何回出現したかを計算するプログラムです
ですが、実行中にプログラムが停止してしまいます。
ちょうど、文字列を入力したあとくらいです。

エラーメッセージ kadai13は動作を停止しました

###該当のソースコード

#include<stdio.h> void analyzeString(char *a,int *len,int *cnt); int main(){ char string[256]; int count[26] = {}; int *lengh = 0; int i; fgets(string,256,stdin); analyzeString(string, lengh, count); printf("lengh = %d\n",*lengh); for(i=0;i<26;i++){ printf("%c : %d\n",'a'+i,*(count+i)); } } void analyzeString(char *a,int *len,int *cnt){ int i; *len = 0; while(a[*len] != '\0'){//lenをカウントとして使うが実際の値は+1になる for(i=0;i<26;i++){ if(a[*len] = 'a'+i){ cnt[i]++; } } *len++; } *len++; }

###試したこと
ソースコードを熟読しましたが間違いを見つけることができませんでした

まだまだ未熟ですがアドバイス等お願いします。

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

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

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

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

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

guest

回答3

0

ご参考のプログラムです。

int lengh[1] = {};

ポインタがNULLに0値を代入していましたので配列にしました

if(a[*len] == 'a'+i)

=で代入になっていました。

(*len)++;

アドレス値をインクレメントしていましたので変更

c

1#include<stdio.h> 2 3void analyzeString(char *a,int *len,int *cnt); 4 5int main(){ 6 char string[256]; 7 int count[26] = {}; 8 int lengh[1] = {}; 9 int i; 10 fgets(string,256,stdin); 11 analyzeString(string, lengh, count); 12 printf("lengh = %d\n",lengh[0]); 13 for(i=0;i<26;i++){ 14 printf("%c : %d\n",'a'+i,*(count+i)); 15 } 16} 17 18 19void analyzeString(char *a,int *len,int *cnt){ 20 int i; 21 *len = 0; 22 while(a[*len] != '\0'){//lenをカウントとして使うが実際の値は+1になる 23 for(i=0;i<26;i++){ 24 if(a[*len] == 'a'+i){ 25 cnt[i]++; 26 break; 27 } 28 } 29 (*len)++; 30 } 31} 32~

投稿2017/07/02 12:04

編集2017/07/02 12:15
A.Ichi

総合スコア4070

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

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

hoge01

2017/07/02 12:10

回答ありがとうございます。 要点を抑えた回答、非常にわかりやすかったです。 今後ともよろしくお願いします。
A.Ichi

2017/07/02 12:13

printの行を削除してしまったので戻しました。
guest

0

int *lengh = 0;ヌルポインタなので、*lenghとして書き込もうとすればアクセス違反で死にます。

int length;として、analyzeStringに渡すときに&lengthとしましょう。

投稿2017/07/02 11:04

maisumakun

総合スコア145183

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

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

hoge01

2017/07/02 12:08

回答ありがとうございます! 非常にわかりやすく説明していただいて、うれしいです。 原因はアクセス違反だったんですね。。。
guest

0

ベストアンサー

1.ポインタlenghに0(NULL)を代入してそのままそのアドレス内容を参照しようとしている
2.後置++は、*より優先度が高いので、*len++は、(*len)++でなく*(len++)と同じ
3.count配列の各要素をゼロで初期化していない
4.代入の=と比較の==を間違えている
くらいでしょうか。
表示される長さは、改行まで含んでとなりますね。改行文字をカウントしないなら、
while(a[*len] != '\0' && a[*len] != '\n')
とかでしょうか。

C

1#include<stdio.h> 2 3void analyzeString(char *a,int *len,int *cnt); 4 5int main(){ 6 char string[256]; 7 int count[26]; 8 int lengh = 0; 9 int i; 10 for(i=0;i<26;i++){ 11 count[i]=0; 12 } 13 fgets(string,256,stdin); 14 analyzeString(string, &lengh, count); 15 printf("lengh = %d\n",lengh); 16 for(i=0;i<26;i++){ 17 printf("%c : %d\n",'a'+i,*(count+i)); 18 } 19} 20 21 22void analyzeString(char *a,int *len,int *cnt){ 23 int i; 24 *len = 0; 25 while(a[*len] != '\0'){//lenをカウントとして使うが実際の値は+1になる 26 for(i=0;i<26;i++){ 27 if(a[*len] == 'a'+i){ 28 cnt[i]++; 29 } 30 } 31 ++*len; 32 } 33}

投稿2017/07/02 11:03

otn

総合スコア84505

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

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

hoge01

2017/07/02 12:04

非常にわかりやすい回答ありがとうございました。 ++のほうが優先度が高いなど曖昧になっていたところがはっきりとわかり、気持ちいい気分です! また機会があればよろしくお願いします。 *せっかく回答してくださったのに、反抗するようになってしまって申しわけないのですが、調べてみたところ、配列は ={}; ですべて初期化できるようです。
otn

2017/07/02 12:38

あ、そうでしたか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問