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

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

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

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

Q&A

解決済

3回答

5319閲覧

C++ 配列 中身 表示

xasax0404

総合スコア27

C++

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

0グッド

0クリップ

投稿2016/09/16 08:40

配列の中身を表示させたいのですがうまくいきません。。。

・実現させたい事
char a[100] = {"41v32v35v38"};という配列の中身を
41
29 ←16進数
32
35
38
と表示させたいです。

考えた結果、

char a[100] = {"41v32v35v38"};
char b[100];
char c[100];

int sousin = 0;
int i = 0;

while (1){
if (a[i] != 'v'){
b[i] = a[i];
i++;
}
else{
printf("%s\n", b);
sousin = atoi(b);
sprintf(b, "%x", sousin);
puts(b);
break;
}
}

for (int s = 0; s < 3; s++){
int j = 0;
while (a[i] != 'v'){
c[j] = a[i];
i++;
j++;
}
i++;
printf("%s\n", c);
}

実行結果
41
29

32
35
となります。
38がどうしても出ないんですが、どのように改善すればよろしいでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

38がどうしても出ないんですが、どのように改善すればよろしいでしょうか?

それは、格納されている文字列が

char a[100] = {"41v32v35v38"};

と、38の最後がvじゃないからです。

C

1for (int s = 0; s < 3; s++){ 2 int j = 0; 3 while (a[i] != 'v'){ 4 c[j] = a[i]; 5 i++; 6 j++; 7 } 8 i++; 9 printf("%s\n", c); 10}

どういうことかというと、このforループの中のwhileループの条件がa[i] != 'v'vでない間whileループを抜け出さないためです。
C/C++の文字列の最後はヌルで終わりなのでwhileの条件としてa[i] != '\0'を加えないといけません。つまり

C

1while(a[i] != 'v' && a[i] != '\0') { 2 // 省略 3}

とすれば、whileループを抜けるので38も表示されるはずです。

投稿2016/09/16 08:51

PineMatsu

総合スコア3579

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

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

xasax0404

2016/09/19 23:50

分かりやすい回答ありがとうございます。 配列の中身が{"41v32v35v38z"}の場合で同じ処理をしたい場合はどうすればいいのでしょうか? この文法だと出来ません。。。
PineMatsu

2016/09/20 00:06

whileの条件文を追加すれば出来ますよ。 while(a[i] != 'v' && a[i] != 'z' && a[i] != '\0') { とすればvやzまたは文字列の最後のヌル文字以外はwhileのループが走ります。 vとかzと言うのは数字の区切り文字ですよね?それをわかれば区切り文字以外を処理すると考えることが出来ます。(文字列の最後はヌルなのでその判断も必ず必要)
guest

0

C++

1#include <cstdio> 2#include <cstring> 3#include <cstdlib> 4 5int main() { 6 char a[] = "41v32v35v38"; 7 for ( char* token = strtok(a, "v"); token; token = strtok(nullptr, "v") ) { 8 printf("dec:%s hex:%x\n", token, atoi(token)); 9 } 10}

投稿2016/09/16 13:21

episteme

総合スコア16614

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

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

0

下のwhile文は3回出力を行おうとしているようですが、1回目が改行コードのみとなってしまっています。

実行結果
41
29
<- 1回目
32 <- 2回目
35 <- 3回目

なぜ、こうなるかというと、上のwhile文を抜ける時にa[i]は3文字目の'v'を指しているからです。
なので、上のwhile文を抜ける前に、カウンタiをインクリメントしてあげましょう。

また、下のfor文内のwhile文は'v'が来るまで回ってしまうので、
終端文字で止めてあげましょう。

C

1char a[100] = {"41v32v35v38"}; 2char b[100]; 3char c[100]; 4 5int sousin = 0; 6int i = 0; 7 8while (1){ 9 if (a[i] != 'v'){ 10 b[i] = a[i]; 11 i++; 12 } 13 else{ 14 printf("%s\n", b); 15 sousin = atoi(b); 16 sprintf(b, "%x", sousin); 17 puts(b); 18 i++; 19 break; 20 } 21} 22 23for (int s = 0; s < 3; s++){ 24 int j = 0; 25 while ((a[i] != 'v') && (a[i] != '\0')){ 26 c[j] = a[i]; 27 i++; 28 j++; 29 } 30 i++; 31 printf("%s\n", c); 32}

投稿2016/09/16 09:11

Kmassa

総合スコア161

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問