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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

1803閲覧

C言語 Segmentation fault の原因を教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/12/22 18:11

編集2021/12/22 18:14

前提・実現したいこと

ppprooooggeennn という文字列に対して ppprooooggeennn を ppp r oooogg ee nnn と文字の種類で分割ppp r oooogg ee nnn を p3 r o4 g2 e2 n3 に変換※(r を r1と表示すると文字数が増えるので r は特に変換されない) p3r o4g2e2n3 として表示したいです。
配列は使わず、ポインタだけでソースコードをかきたいです。

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

input string aaabbddd Segmentation fault

該当のソースコード

#include<stdio.h> int main(){ char *p,*ppp; int i,k=1,l=0,*pp; printf("input string "); scanf("%s",p); printf("a\n"); for(i=0;i<50;i++){ if(*(p+i)==*(p+i-1)){ *(pp+l)=k; k++; } else{ *(ppp+l)=*(p+i); k=0; l++; } } printf("encode string "); for(i=0;*(ppp+i)!=0;i++){ printf("%c",*(ppp+i)); if(*(ppp+i)!=0){ printf("%d",*(pp+i)); } } return 0; }

試したこと

初めの文字入力のあとにすぐプリントをしているのですが、それすらもでず、エラーになってしまいます。

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

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

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

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

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

jimbe

2021/12/22 19:01

したい・かきたい、というよりもそのような課題なのでは。 少なくとも、 scanf に指定したポインタはちゃんとしたアドレスが入っていませんので、システムを破壊するために Segmentation fault です。 scanf の使い方(かポインタの使い方)の復習が必要かと思われます。
jimbe

2021/12/22 19:07 編集

また、制限項目を確認された方が良いようにも思います。 「全てにおいて配列を使わないこと」のでは無く、「配列の添字によるアクセスを使わないこと」ではないでしょうか。 (「配列を表立って」使わずには書けますが、それをご存じか分かりませんので。)
thkana

2021/12/22 21:54 編集

課題ですね。みなさんあちこちで聞きまくっているのかな。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10254306495 誰も解けないのかよ... 教える方も「ランレングス圧縮」とかのキーワードと一緒に教えておけばよいのに。 最近のYahoo知恵袋のプログラミングカテゴリーは丸投げ対応回答(解答)隊が充実しているようなので、その用途にはあちらに行ったほうがよろしいかと思います。教える側のマークも厳しくなりそうだけれど。
dodox86

2021/12/23 03:10

回答を得てとっとと退会。
jimbe

2021/12/23 13:50 編集

「仲間内では」誰も解けなかったんでしょうね^^; コードがこれだけあって領域が無いという状況も変な作り方(?)ですけど。 私だと thkana さんのリンク先の回答の umi***~ さんのコードの感じですね。 char *encode(char *dst, const char *src) { *dst = *src; int n = 0; for(char *d=dst, *s=src; *d; s++, n++) { if(*s == *d) continue; d ++; if(n > 1) d += sprintf(d, "%d", n); *d = *s; n = 0; } return dst; }
guest

回答2

0

ベストアンサー

C

1char *p; 2scanf("%s",p);

そりゃ落ちます。

これは、 p というポインタ(要はアドレス)を入れる変数を確保しただけで、
実際に文字を入れる領域が確保されているのではありません。

なので、文字を入力すると、*p が指し示しているでたらめなアドレスから、
順番に文字の値を書き込んでプログラムやデータ領域を破壊していきます。

文字をいれる場所、を確保してあげないといけません。
静的に確保するなら、

C

1 char p[1024]; 2 scanf("%s",p);

動的に確保するなら、

C

1#include <stdlib.h> 2---- 3<中略> 4 5 char *p; 6 p = (char *)calloc(1024, sizeof(char)); 7 scanf("%s",p); 8 9<中略> 10 11 free(p); /* 最後にメモリを解放してあげる必要がある */

投稿2021/12/22 23:02

ak.n

総合スコア291

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

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

0

p も pp も ppp も、初期化もせずになんかをしようとしてますがめちゃくちゃです。

scanf("%s",p);

入力の文字列はどこに格納されるのか説明できるでしょうか

c言語の基本的な文法、基本的な動作をもちっときちんと学習する必要がありますね

投稿2021/12/22 22:59

y_waiwai

総合スコア87804

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問