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

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

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

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

Q&A

3回答

964閲覧

ポインタについて課題をときながら教えてください。

sho888

総合スコア14

C

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

0グッド

0クリップ

投稿2022/11/01 10:52

**イタリックテキスト**### 前提

キーボードから入力された文字列(最大50文字,途中にスペースを含まない)に対し,次の処理を行うプログラムを作成せよ.

(処理1)ポインタ pt を文字列の先頭を指し示すように設定し,指し示されている文字 *pt を表示する.
(処理2)ポインタが文字列の終端に到達するまで,次の(※)を繰り返す.
(※)文字 *pt が1-9のいずれかの数字であれば数字の分だけ,それ以外であれば1文字分だけ,ポインタを文字列の終端側に移動させ,新たに指し示された文字 *pt を表示する.

たとえば,読み込んだ文字列が「a23456789」であれば,ポインタは最初は先頭の文字「a」を指し示しており,これを画面に表示する.次に,「a」は数字ではないので,ポインタを1文字分終端側に移動させる.その結果ポインタは「2」を指し示すので,これを画面に出力する。次に,「2」は数字なので,ポインタを2文字分終端側に移動させ,「4」を出力する.次にポインタを4文字分終端側に移動させ,「8」を表示する.次にポインタを8文字分終端側に移動させようとするが,その途中でポインタは文字列の終端に到達するので,ここでプログラムを終了する.

[実行例1]
[入力] → [出力]
a23456789 → a;
2;
4;
8;
[実行例2]
[入力] → [出力]
ab2cde3fgh5ij → a;
b;
2;
d;
e;
3;
h;
5;

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

gandamu

2022/11/01 11:03

何回か投稿されているのを拝見いたしました!🙄 質問は下部にある、編集ボタンから編集できます! 投稿は質問下部にある削除ボタンから、削除できますので、試してみてください!!
y_waiwai

2022/11/01 11:10

質問は編集できます 無駄に質問建てないで追記修正しましょう
episteme

2022/11/02 00:03

課題なら自分でやろうよ。どこが/なにがわかんないんですか?
jimbe

2022/11/02 03:06

教えてと言ってもコードだけあれば BA みたいですし、やる気感じられません。
kazuma-s

2022/11/02 21:17

> ▲▲機能を動作するようにする これ何ですか? 質問を修正してください。
guest

回答3

0

私の全ての解答は私の友達から送信された解答である。

C

1#include <stdio.h> 2 3char S[52]; 4 5void input(void) { 6 char s[52], *P=S, *Q=s; 7 scanf("%s", s); 8 while (*Q!='\0') { 9 *P=*Q; 10 P++; Q++; 11 } 12 return; 13} 14 15void play(void) { 16 int x, i; 17 char *P=S; 18 while (1) { 19 printf("%c;\n", *P); 20 if ('1'<=*P && *P<='9') { 21 x=*P-'0'; 22 for (i=0; i<x; i++) { 23 P++; 24 if (*P=='\0') return; 25 } 26 } 27 else P++; 28 if (*P=='\0') return; 29 } 30 return; 31} 32 33int main(void) { 34 input(); 35 play(); 36 return 0; 37}

投稿2022/11/02 18:41

編集2022/11/03 18:59
atcoderyellow

総合スコア481

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

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

jimbe

2022/11/03 04:08

>キーボードから入力された文字列(最大50文字 を処理できません。
atcoderyellow

2022/11/03 19:00

OH DAMN 私は私の友達に彼女のプログラムを修正するように連絡した。 彼女は彼女のプログラムを修正した。
guest

0

c

1#include <stdio.h> 2int main(void){ 3 char b[50+1]; 4 scanf("%s", b); 5 for(char *pt=b; *pt; pt++) { 6 printf("%c;\n", *pt); 7 if('1'<=*pt && *pt<='9') for(int n=*pt-'1'; n && pt[1]; n--, pt++); 8 } 9}

一々終端チェックするよりも範囲外かのほうが簡単ですけど。

c

1#include <stdio.h> 2int main(void){ 3 char b[50+1]; 4 scanf("%s", b); 5 for(char *pt=b, *end=&b[strlen(b)]; pt<end; pt++) { 6 printf("%c;\n", *pt); 7 if('1'<=*pt && *pt<='9') pt += *pt-'1'; 8 } 9}

投稿2022/11/03 04:59

編集2022/11/04 03:03
jimbe

総合スコア12696

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

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

0

質問文内で示された2つの入力例でしか結果確認していないが.

C

1const char *F( const char *p ) 2{ 3 int x = ((*p&0xF0)==0x30) * ("1123456789111111"[*p&0x0F]-'1') + 1; 4 while( x && *p ){ ++p; --x; } 5 return p; 6} 7 8int main(void) 9{ 10 char S[50+1] = { 0 }; 11 scanf( "%s", S ); 12 { 13 const char *p = S; 14 do{ putchar(*p); putchar('\n'); } 15 while( *(p=F(p)) ); 16 } 17 return 0; 18}

投稿2022/11/02 01:46

fana

総合スコア11673

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

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

fana

2022/11/02 01:51 編集

> 文字 *pt が1-9のいずれかの数字であれば数字の分だけ,それ以外であれば1文字分だけ のところの実装がダサい気がする. 特定の文字コード前提になってるし.
jimbe

2022/11/03 04:07

>特定の文字コード前提になってる まぁ特に課題なら仕方無いのでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問