🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Q&A

解決済

2回答

4957閲覧

C言語 del_digit関数を添字演算子を使わずに書き換えるには

creephyp_08

総合スコア4

C

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

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

0グッド

0クリップ

投稿2021/01/17 09:04

受け取った配列の数字だけを消去するプログラム(例:TK13G5→TKG)を書きましたが、これを添字演算子を使わず、ポインタを用いて書き換えるとどのようなプログラムになりますか。

#include <stdio.h>

/--- 文字列str中の数字文字を削除する ---/
void del_digit(char str[])
{
int i = 0, idx = 0;

while (str[i]) { if (str[i] < '0' || str[i] > '9') str[idx++] = str[i]; i++; } str[idx] = '\0';

}

int main(void)
{
char str[100];

printf("文字列を入力してください:"); scanf("%s", str); del_digit(str); // 数字文字削除 puts("数字文字を削除しました"); printf("str=%s\n", str); return (0);

}

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

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

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

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

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

guest

回答2

0

tatsu99さんの回答への補足です。

C11規格書から引っ張っておきます。まずは添字演算子の定義から。

6.5.2.1 Array subscripting

Semantics

2 A postfix expression followed by an expression in square brackets [] is a subscripted
designation of an element of an array object. The definition of the subscript operator []
is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that
apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the
initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th
element of E1 (counting from zero).

(仮訳)
[]のような角括弧の式のような後置演算子は配列オブジェクトの添字指定です。添字演算子[]E1[E2](*((E1)+(E2)))と同一であるというように定義されます。二項演算子+における変換規則によって、もしE1が配列オブジェクトで(これは配列オブジェクトの先頭要素へのポインタと等価ですが(訳注: array to pointer conversionのこと))E2が整数ならば、E1[E2]E1E2番目の要素を示します。

一方で配列の宣言は次のように定義されています。ここで[]は演算子ではありません。

6.7.6 Declarators

Syntax
1

declarator:
pointeropt direct-declarator
direct-declarator:
identifier
( declarator )
direct-declarator [ type-qualifier-listopt assignment-expressionopt ]
direct-declarator [ static type-qualifier-listopt assignment-expression ]
direct-declarator [ type-qualifier-list static assignment-expression ]
direct-declarator [ type-qualifier-listopt * ]
direct-declarator ( parameter-type-list )
direct-declarator ( identifier-listopt )

投稿2021/01/17 11:16

yumetodo

総合スコア5852

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

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

creephyp_08

2021/01/18 02:21

なるほど…[]にもいろいろあるんですね。ご丁寧にありがとうございました!
guest

0

ベストアンサー

mainは同じです。del_digitのみ書き換えました。

C

1void del_digit(char *str) 2{ 3 char *trg = str; 4 while (*str) { 5 if (*str < '0' || *str > '9') 6 *trg++ = *str; 7 str++; 8 } 9 *trg = '\0'; 10} 11

投稿2021/01/17 09:14

tatsu99

総合スコア5493

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

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

creephyp_08

2021/01/17 09:54

迅速なご返信ありがとうございます! 無事コンパイルできました。 的外れな質問だったら申し訳ないのですが、main内のchar str[100]は添字演算子ではないのでしょうか? もしそうであれば、これをポインタを用いて書き換えることは出来ますでしょうか。 度々申し訳ございません。
tatsu99

2021/01/17 10:05

>main内のchar str[100]は添字演算子ではないのでしょうか? 領域の定義の場合は添字演算子ではないと思いますが。 もし、どうしても、ポインターを使って書き換えたいなら、 char *str; str = malloc(100); のようにすればよいかと。(問題の趣旨からはずれるかもしれませんが)
creephyp_08

2021/01/17 11:11

納得しました!ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問