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

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

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

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

Q&A

解決済

1回答

1170閲覧

配列の途中の要素を消す方法

Merrifield

総合スコア31

C

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

0グッド

0クリップ

投稿2020/09/07 02:18

編集2020/09/07 02:55

下の例のよう整数のリストが与えられ、重複を一番左の要素から消して、それをreturnする関数を作成しようと思っています。(codewarsのこの問題ですhttps://www.codewars.com/kata/5ba38ba180824a86850000f7/train/c)
特に、重複があったときに重複部分を左端から取り除くという部分がどのようにするか、自分で書いたコードだとその部分をややこしく書いてしまっている感じがするので、良い方法があれば教えていただきたいです。また、それ以外に部分でもコードにおかしなところがあると思うので、それも指摘していただければありがたいです。

solve [3, 4, 4, 3, 6, 3]-- => [4, 6, 3] -- Remove the 3's at indices 0 and 3 -- followed by removing a 4 at index 1 [1, 2, 1, 2, 1, 2, 3] → [1, 2, 3] [1, 1, 4, 5, 1, 2, 1] → [4, 5, 2, 1]

コード

c

1#include <stdlib.h> 2#include <stddef.h> 3 4int* solve(const int* arrin, size_t szin, size_t *szout) { 5 // NB: assign the length of your return array to the provided *szout 6 int i, arsize = (int)szin; 7 int *base = malloc(arsize); 8 *base = *arrin; //arrinがconstなのでbaseにアドレスをコピー 9 10 11 for(i = 1; i < arsize; i++) 12 { 13 int count = 0; 14 if(base[0] == base[i])count++; 15 16 if(count != 0) //重複があれば要素の2番目から先頭に詰める 17 { 18 arsize--; 19 for(int j = 1, k = 0; j < arsize; j++, k++) 20 { 21 base[k] = base[j]; 22 i = 1; 23 24 } 25 } 26 27 28 29 } 30 31 32 *szout = (size_t)arsize; 33 return base; 34} 35 36

エラー(テストコードにconstを付けた結果)

fixture.c:49:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:49:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ fixture.c:59:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:59:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ fixture.c:70:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:70:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ fixture.c:80:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:80:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ 8 warnings generated.

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

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

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

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

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

maisumakun

2020/09/07 02:23

提示されたコードとエラーメッセージでsolveの定義が違うようですが、どちらが正しいのですか?
Merrifield

2020/09/07 02:29 編集

どこかが違うのか分からなかったのですが、問題としては最初に int* solve(const int* arrin, size_t szin, size_t *szout) のように与えられていたので、これで正しいと思います。 文字数の関係で質問文には載せられなかったのですが、https://www.codewars.com/kata/5ba38ba180824a86850000f7/train/c 内のSample Testsを見ていただければ分かるかもしれません。
maisumakun

2020/09/07 02:35

> どこかが違うのか分からなかったのですが エラーメッセージには「int* solve(int* arrin, size_t szin, size_t *szout);」と、constなしのものが出力されています。
Merrifield

2020/09/07 02:46

確かにそうですね。sample testのほうのコードにconstが付いていなかったです。これに関してエラーが出ている感じですかね。sample testnほうに自分でconstをつけたらwarningが減ったので、もしかしたらサイト側のミスかもしれません。ただ、ほかの回答者を見る限り、回答ではconstを付けたままコードを書いているので、constを付けた状態でコードを書きたいと思います。
Daregada

2020/09/07 02:50

テスト用コードのほうのプロトタイプ宣言に「int* solve(int* arrin, size_t szin, size_t *szout);」と書いてあるんですよねえ。
Merrifield

2020/09/07 02:54

Daregadaさん その部分がサイト側のミスか分からないのですが、テストコードに自分でconstをつけるとエラーが減ったので、関数側ではconstを付けたままコードを作成します。
mjk

2020/09/07 07:00

回答は控えますが自分なら逆順から走査した方がすっきり実装出来そうかなと問題を見て直感しました。(未実装未検証なのであしからず)
Merrifield

2020/09/07 07:03

mjkさんありがとうございます。その方法も考えてみます。
guest

回答1

0

ベストアンサー

int *base = malloc(arsize);
mallocで確保した領域の先頭アドレスを、baseに書き込みます。

*base = *arrin; //arrinがconstなのでbaseにアドレスをコピー
baseは領域の先頭アドレスですので、*baseは、そのアドレスへのアクセスです。
同様に、arrinは領域の先頭アドレスですので、*arrinは、そのアドレスへのアクセスです。
なので、その内容はbase[0]=arrin[0];と同じです。アドレスのコピーにはなりません。
また、もし仮にアドレスをコピーしてしまっていたら、mallocで確保した領域へのアドレスを失うので、
そのメモリをリークしてしまいます。

その後のコードは、
「1文字目とそれ以外の文字を比較して」
「同じ文字が出るまではスキップし」
「同じ文字が一つでも出たら」
「2文字目以降をずらしてコピーし」
「以降無限ループ」
というコードになってしまっているので、
とりあえずは、何をするかのロジックを言葉で書いてみて、
やることを整理をしてからコードに手を付けた方が良いかと思います。

投稿2020/09/07 02:47

amiya

総合スコア1218

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問