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

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

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

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

Q&A

解決済

4回答

3456閲覧

C言語のおけるint配列の0を消す

Danrussia

総合スコア44

C

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

0グッド

2クリップ

投稿2021/06/06 07:21

編集2021/06/06 07:36

前提・実現したいこと

C言語で数値配列を操作して、数値配列の0を消したいと思っています。

<例> [0,0,1,2] → [1,2] [0,0,0,1] → [1] [0,1,0,0] → [1,0,0] [0,0,0,0] → [0]

ワークフローとしては、渡された配列の要素数、長さが2以上で一番上の桁(先頭の桁)が0なら、その要素を削除するというような感じでWhileループを回したいと思っているのですが、他の言語(Python)みたいな配列の操作ができず、C言語初心者で、実装の見当がつかないです。

実際の状況としては、char配列をint配列にした後に先頭の0を消したいです。

C

1#include <stdio.h> 2int main(void){ 3 4 char Input[10]; 5 fgets(Input , 10 , stdin); 6 int Int_List[10]; 7 8 int N; 9 N = strlen(Input); 10 11 for (int i = 0; i < N; i++){ 12 13 Int_List[i] = Input[i] - '0'; 14 15 } 16 17 18}

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

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

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

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

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

maisumakun

2021/06/06 07:24

当該の「数値配列」は、どのように確保したものですか?
Danrussia

2021/06/06 07:27

ごめんなさい、サンプルのソースコードを記述し忘れたので今加筆します。
rubato6809

2021/06/06 14:00

元が同じ4文字でも[0,0,1,2] → [1,2] なら結果の数字列は2桁、[0,0,0,1] → [1]なら数字列は1桁です。 桁数の違いをどう区別するつもりですか? 桁数を持つ変数(値は2または1になる)を用意する?それとも[1,2,-1], [1,-1] のように終端を示す値を格納する?
rubato6809

2021/06/06 14:00

maisumakunさん方式(char配列をint配列にする前にやってしまう)ではだめですか?
guest

回答4

0

実際の状況としては、char配列をint配列にした後に先頭の0を消したいです。

char配列をint配列にするにやってしまったほうが楽かもしれません。

C

1char * ptr = Input; 2// '0'以外の文字が出るまでptrを進める 3for(;*ptr == '0'; ++ptr); 4// 残りの文字をint配列へ 5for(int i = 0; *ptr; ++i, ++ptr) { 6 Int_List[i] = *ptr - '0'; 7}

投稿2021/06/06 07:40

maisumakun

総合スコア146018

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

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

HogeAnimalLover

2021/06/06 07:43

これだと"000"とか"0"のように、ゼロとなる文字列をスルーしますね。
guest

0

C言語では変数を中途で削除することはできません。

代案例
0. メモリを動的に確保するmalloc系統の機能を使う
0. スキップインデックスを指し示す変数を逐一用意する

投稿2021/06/06 07:37

HogeAnimalLover

総合スコア4830

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

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

0

ベストアンサー

配列を縮めることは出来ないので、配列の何番目まで有効なデータかを示す変数が必要です。
下記ではN

なお、fgetsは改行文字を含んで配列に入れるので、strlen(Input)-1がデータ長です。

#include <stdio.h> int main(void){ char Input[10]; fgets(Input , 10 , stdin); int Int_List[10]; int N; int j; N = strlen(Input)-1; j = 0; for (int i = 0; i < N; i++){ Int_List[j] = Input[i] - '0'; if(j || Int_List[j]) j++; } N = j; for (int i = 0; i < N; i++){ printf("[%d] = %d\n",i,Int_List[i]); } }

投稿2021/06/06 08:06

otn

総合スコア85901

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

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

0

C

1#include <stdbool.h> 2int main() { 3 int array[] = { 0, 0, 1, 2, 0 }; 4 bool found_non0 = false; 5 6 // 0でない要素を見つけたら、それ以降を前に詰める 7 // array[0~w-1] が結果となる 8 for ( int r = 0, w = 0; r < 5; ++r ) { 9 if ( array[r] != 0 ) { 10 found_non0 = true; 11 } 12 if ( found_non0 ) { 13 array[w++] = array[r]; 14 } 15 } 16}

投稿2021/06/06 07:42

episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問