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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

1130閲覧

char型配列の比較

tuyudaku

総合スコア75

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2018/10/24 00:34

編集2018/10/24 00:40

簡単な質問で申し訳ありません

char型の配列に格納された整数が0であるかどうかの判定は
皆さんならどのように行ないますか?

C++

1char tmp[3]; 2 3(tmpに整数を代入する処理) 4 5if( tmpの要素全てに0が格納されているかどうかの判定 ) 6{ 7}

皆さんならどのように実装するでしょうか?
なるべくシンプルに実装したいのですが
自分で考えたものはなんか汚く見えて...w

アンケートみたいになってしまって申し訳ありませんが
回答よろしくお願いいたします

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

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

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

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

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

maisumakun

2018/10/24 00:38

char[]ですが、文字列ではなく数値ということで間違いないですか?
tuyudaku

2018/10/24 00:39

はい、間違いないです。すみません、もう少し明確にしておくべきでした
guest

回答4

0

ベストアンサー

std::all_of を使います。

C++

1#include <algorithm> 2#include <iostream> 3#include <iterator> 4 5int main(void) { 6 char arr1[] = {0, 0, 0, 0}; 7 char arr2[] = {0, 0, 0, 1}; 8 9 std::cout << std::boolalpha; 10 11 std::cout 12 << std::all_of(std::cbegin(arr1), std::cend(arr1), [](auto e) { return e == 0; }) 13 << "\n" 14 ; 15 std::cout 16 << std::all_of(std::cbegin(arr2), std::cend(arr2), [](auto e) { return e == 0; }) 17 << "\n" 18 ; 19 20 return 0; 21}

実行結果 Wandbox

true false

投稿2018/10/24 01:29

LouiS0616

総合スコア35660

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

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

tuyudaku

2018/10/24 01:42

こんなのがあるとは... [](auto e) の部分は配列の型ということですよね? beginではなくcbeginである理由はなんでしょうか? 変更をしないということを明示的にするため?それともconstである必要があるのでしょうか? 質問を重ねて申し訳ありません
LouiS0616

2018/10/24 01:45 編集

[](auto e) { return e == 0; } ラムダ式です。 > beginではなくcbeginである理由はなんでしょうか? ご推察のとおり変更しないことを明示する目的もありますし、コンパイラ側がそれを踏まえた最適化をかけてくれることも期待しています。
tuyudaku

2018/10/24 01:51 編集

>ラムダ式です。 あ、なるほど...w すみませんよく見てませんでした >コンパイラ側がそれを踏まえた最適化をかけてくれることも期待しています。 なるほど、勉強になりました 回答ありがとうございました
guest

0

こんにちは。

std::all_ofを使うと短く書けますよ。関数やフラグを導入しなくてもthenとelseの両方を書けるのでちょっとすっきりです。

C++

1#include <iostream> 2#include <algorithm> 3 4int main() 5{ 6// char temp[]={0, 1, 2}; 7 char temp[]={0, 0, 0}; 8 if (std::all_of(std::begin(temp), std::end(temp), [](char x){return x==0;})) 9 std::cout << "all zero\n"; 10 else 11 std::cout << "not zero\n"; 12}

【追記】
あああ、ゆったり書いている内に被ってしまいました。
all_ofの再実装になるのでやるべきではないですが、こんなアイデアもあるという意味で、ラムダ式を使う案も載せておきます。

C++

1#include <iostream> 2#include <algorithm> 3 4int main() 5{ 6// char temp[]={0, 1, 2}; 7 char temp[]={0, 0, 0}; 8 9 auto isZero= 10 [](auto const& array) 11 { 12 for (auto x:array) 13 if (x!=0) 14 return false; 15 return true; 16 }; 17 18 if ( isZero(temp) ) 19 std::cout << "all zero\n"; 20 else 21 std::cout << "not zero\n"; 22}

投稿2018/10/24 01:52

編集2018/10/24 01:56
Chironian

総合スコア23272

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

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

tuyudaku

2018/10/24 06:40

追記までしていただきありがとうございます ラムダ式を使いこなせるようになったらとても便利そうですね 遠ざけずに勉強しないと...w 回答ありがとうございました
guest

0

C言語になってしまいますが、比較用の配列を用意しておいてmemcmpするとか。

c

1 char hikaku[3] = {}; 2 if(memcmp(temp, hikaku, sizeof(temp)) == 0){

3要素くらいならif文の&&で並べてしまってもいいと思いますが。

c

1 if(temp[0] == 0 && temp[1] == 0 && temp[2] == 0){

要素数は3つに限らない、比較値が0とは限らない、のであればループで回すのが一般的ですかね。

投稿2018/10/24 02:01

ttyp03

総合スコア16998

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

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

tuyudaku

2018/10/24 07:02

>比較用の配列を用意しておいてmemcmpするとか 確かに、シンプルで分かりやすい実装ですね 普通に思いつきませんでしたw >3要素くらいならif文の&&で並べてしまってもいいと思いますが。 確かにそうですね ただ個人的に0,0,0と三つ並んでるのは なんか不恰好だなぁというわがままな考えがありますw 回答ありがとうございました
myoon

2018/12/16 19:20 編集

確かめてないのですが、3つぐらいの場合で、0かどうかの判定のみの場合、 if( !(temp[0] || temp[1] || temp[2]) ).... でもできる筈です。 推奨はできませんが。 「||」のかわりにビット演算の「|」でも動く筈です。 if( !temp[0] && !temp[1] && !temp[2] ) .... も。0が並ばないかわりに意味が分かりにくいのでお世辞にもよい方法ではありませんが。
ttyp03

2018/12/16 23:50

やり方は色々ありますね。 ただあまり短縮的な表現を求めると目的が見えなくなりがちです(可読性が落ちる)。 >「||」のかわりにビット演算の「|」でも動く筈です。 今回の場合ですと|より+の方がいいような気もします。 if( temp[0] + temp[1] + temp[2] == 0 ) if( !(temp[0] + temp[1] + temp[2]) ) 合計値が0か否かというのは、処理の意味合いとしてもわかりやすいですし。
myoon

2018/12/17 21:51 編集

はい。可読性が落ちるので、非推奨です(^^;)。 足し算だと、(char が符号付きの場合)0でない3個のchar型の値の合計(それぞれint型になってですが)がたまたま0になる場合があると思います。
guest

0

フラグ用の変数を用意しておき、For文で毎要素確認します
また、何度も行う確認であれば、メソッドにします

投稿2018/10/24 00:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tuyudaku

2018/10/24 01:01

やはりFor文が基本ですかね 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問