
No.7ベストアンサー
- 回答日時:
No.3の補足に対してですが、
> このような場合、関数部から呼び出し側のsize取得は無理ですか?
無理です。
理由は配列を関数に渡したときそれはポインタに格落ちして
サイズに関する情報を失うからです。
この場合は
-------------実行部本体
unsigned char a[10];
ret = func_b(a, sizeof(a)/sizeof(a[0]));
・
・
・
-------------関数部
int func_b(unsigned char a[], size_t size)
{
sizeを利用した処理
}
とするのが普通だと思います。
No.6
- 回答日時:
・a[i]の値はランダムで、いつ0が入るかわからない
・strlenで9(この場合最後に\0が入るので)以外の時に戻り値でエラーコードを返したい
んむ?
if(strlen(a) != 9) /* error */;
else /* ok */;
てゆこと?
コレじゃダメなの?
途中で0x00が入る=文字列が終わる、だよ?
ヌル文字列が使えないというのなら、データ数(=strlen?の値)を引数か何かでもらうしかないよね。
No.5
- 回答日時:
strlenは'\0'で終わる文字列の長さを取得する関数です。
unsigned char a[10];
int len = sizeof(a)/sizeof(unsigned char);
としても、取得できるのは配列の要素数10です。
んなもんは
#define MAX_SIZE 10
unsigned char a[MAX_SIZE];
int len = MAX_SIZE;
としたって同じです。
求めたい"長さ"の定義にそってカウントする関数を自分で作ればよいでしょう。
No.4
- 回答日時:
がると申します。
ちとあちこち混乱しているようなので、情報の整理をいたします。
まず、
unsigned char a[10];
と宣言されている配列において、「aという配列のサイズ」は確かに#2さん#3さんのおっしゃるとおり10になります(取得方法は sizeof を使用)が、多分質問者さん的には、別に配列のサイズそのものは要求されていないかと思われます。
で、質問者さんが欲しいのは
「データに0x00が混ざる場合に、そのデータの長さをstrlenで取得したいのだが、どうしてもうまくとれない」という内容になるかと思うのですが。
結論からいうと「無理」です。
strlenは「文字の長さを数える」ものであり、C言語及びC++において、0x00は「文字列の終端」を意味するので、どうしてもそこで止まってしまいます。
もしC言語をお使いであれば構造体を、C++をお使いであればクラスを用いるのがもっともよいかと思われるのですが。
またご質問コメントなどいただければ、わからない部分について捕捉いたしますのでお気軽にお書きください ^^
この回答への補足
ちょっと説明します。
#No.3の補足にあるような形式で、条件としては
・関数部は自分が作るが、呼び出し部は他人が作り、こちらからは指定できない
・a[i]の値はランダムで、いつ0が入るかわからない
・strlenで9(この場合最後に\0が入るので)以外の時に戻り値でエラーコードを返したい
と言う事になります。
言語はCですので構造体を使うしかないでしょうか。
No.3
- 回答日時:
本当に
unsigned char a[10];
と宣言しているなら、sizeof(a)は10になります(但しunsigned charが1バイトの処理系のみ)
配列のように使用しているが、ポインタで
unsigned char *a;
と宣言しているなら、sizeof(a)は4になります(但しポインタが32ビットの処理系のみ)
なお、sizeofは(その処理系で)必要になるメモリ領域のバイト数を返すので、バイト数ではなく要素数を調べる場合は
(sizeof(配列変数名)/sizeof(要素の型))
になりますので
(sizeof(a)/sizeof(unsigned char))
と書きます。
この回答への補足
回答ありがとうございます。
ちょっとややこしいんですが、
-------------実行部本体
unsigned char a[10];
ret = func_b(a);
・
・
・
-------------関数部
int func_b(unsigned char a[])
{
sizeof(a);
}
-------------
としています。
このような場合、関数部から呼び出し側のsize取得は無理ですか?
No.2
- 回答日時:
>size=4 になるだけです。
おそらく、ポインタを使っていませんか?
unsigned char a[10];
の様に宣言した 配列としてのa を使っていれば 4 にはならないはずです。
sizeof(a) または、
sizeof(a)/sizeof(unsigned char)
とします。
配列のサイズを得るためにstrlen は、使用できません
No.1
- 回答日時:
どのようなデータの格納される配列で、どのような条件でデータの終端と判断するのでしょう?
それがわからなければどうにもなりません。
というか、それがわかるなら長さを返す関数を作ってしまっては?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語 少しの疑問 4 2022/11/08 02:48
このQ&Aを見た人はこんなQ&Aも見ています
-
ショボ短歌会
ひどい短歌を詠んでください。
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
最速怪談選手権
できるだけ短い文章で怖がらせてください。
-
チョコミントアイス
得意ですか?不得意ですか?できれば理由も教えてください。
-
自分用のお土産
国内や海外に旅行へ行った時、自分用のお土産ってどれくらい買いますか?
-
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
#defineの定数を文字列として読み込む
C言語・C++・C#
-
unsigned char配列への入力の仕方
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
C# 配列の変数宣言について。
-
配列の参照渡しで型が一致しま...
-
C言語初心者 構造体 課題について
-
テキストファイルから文字列を...
-
複数の選択範囲の行番号を個別...
-
銀行ATMの数字キーの配列
-
整数型の配列をランダムに並べ...
-
c言語の配列の境界調整について
-
C言語で特定列だけを抽出して配...
-
C言語 配列の再初期化
-
C# Listを使わずに2次元配列の...
-
ポインタの配列のコンマについて
-
Redimした動的配列はEraseする...
-
VBでC言語のポインタみたい...
-
配列内の文字間を排他的論理和...
-
複数のボタンを配列で扱う方法...
-
配列をEraseしてもメモリが開放...
-
配列で格納したものをmsgboxで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列で格納したものをmsgboxで...
-
配列を使わずに、変数名を動的...
-
C# Listを使わずに2次元配列の...
-
【C言語】配列の中に配列を入れ...
-
C# 配列の変数宣言について。
-
配列の参照渡しで型が一致しま...
-
配列を含む構造体の初期値について
-
ExcelVBAで質問です。離れた二...
-
複数の選択範囲の行番号を個別...
-
先頭アドレスとは何ですか?
-
unsigned char配列への入力の仕方
-
【速いブラインドタッチ】手を...
-
C++ vectorに配列をプッシュしたい
-
配列をEraseしてもメモリが開放...
-
テキストファイルから文字列を...
-
VBで構造体の配列を関数に渡す...
-
銀行ATMの数字キーの配列
-
VB.NET 構造体の配列の検索機能...
-
C言語で特定列だけを抽出して配...
おすすめ情報