ページ 11

カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 18:53
by tsuka
シリアル値が送られて来て,以下のように配列に入っています。
最後は\0が送られるようです。

dat[0]='1' dat[1]=',' dat[2]='2' dat[3]='3'
dat[4]=',' dat[5]='4' dat[6]='5' dat[7]='6'
dat[8]=',' dat[9]='\0'

カンマで区切られて送られてきた文字を
整数に変換して配列に入れたいのですが
やり方が分からないので教えて頂きたい
です。

d[0]=1 d[1]=23 d[2]=456

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 19:08
by みけCAT
例えば、以下のようにするとできるでしょう。

配列の要素を前から順番に見ていきます。
・要素が数字の場合は、変換結果を更新します。(要求に応じて新しい変換結果を作成します)
・要素がカンマの場合は、新しい変換結果の作成を要求するフラグを立てます。

Pythonで実装してみました。

コード:

dat = list(range(10))
dat[0]='1'
dat[1]=','
dat[2]='2'
dat[3]='3'
dat[4]=','
dat[5]='4'
dat[6]='5'
dat[7]='6'
dat[8]=','
dat[9]='\0'

requestNewElement = True
d = []
for elem in dat:
	if elem.isdecimal():
		if requestNewElement:
			d.append(0)
			requestNewElement = False
		d[-1] = d[-1] * 10 + int(elem)
	elif elem == ',':
		requestNewElement = True
	elif elem == '\0':
		break

print(d)

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 20:20
by tsuka
Pythonのプログラムでしょうか?
Python と C言語の違いがまだわかっていません。
申し訳ありませんが,私にはハードルが高く理解が追いつきません。
カンマで区切られたいろんな数値がシリアルで送られて
質問した内容まで理解ができています。
よろしくお願いします。

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 20:35
by 幸尚

コード:

#include <stdio.h>

int main()
{
	char dat[15];
	int list[15];
	int i = 0;
	int count = 0;
	memset(dat, 0, sizeof(dat));
	memset(list, 0, sizeof(list));

	dat[0] = '1', dat[1] = ',', dat[2] = '2', dat[3] = '3';
	dat[4] = ',', dat[5] = '4', dat[6] = '5', dat[7] = '6';
	dat[8] = ',', dat[9] = '\0';

	printf("--------------------\n");
	printf("コンマありのデータ\n");
	printf("--------------------\n");
	while (dat[i] != '\0')
	{
		printf("dat[%d] = %c\n", i, dat[i]);
		i++;
	}

	i = 0;
	while (dat[i] != '\0')
	{
		if (dat[i] != ',')
		{
			list[count] = dat[i] - '0';
			count++;
		}
		i++;
	}

	printf("--------------------\n");
	printf("コンマなしのデータ\n");
	printf("--------------------\n");
	i = 0;
	while (list[i] != '\0')
	{
		printf("list[%d] = %d\n", i, list[i]);
		i++;
	}
	return 0;
}
こんな感じでどうでしょうか?

また、質問する前に言語は何かを明確にしたほうが良いと思います。

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 20:41
by みけCAT
幸尚 さんが書きました:
1年前
こんな感じでどうでしょうか?
「感じ」の意味が不明確ですが、このプログラムはそのままでは条件を満たしておらず、ダメですね。

実行結果

コード:

--------------------
コンマありのデータ
--------------------
dat[0] = 1
dat[1] = ,
dat[2] = 2
dat[3] = 3
dat[4] = ,
dat[5] = 4
dat[6] = 5
dat[7] = 6
dat[8] = ,
--------------------
コンマなしのデータ
--------------------
list[0] = 1
list[1] = 2
list[2] = 3
list[3] = 4
list[4] = 5
list[5] = 6

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 20:46
by 幸尚
すいません、なにがいけないのでしょうか?

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 21:16
by 幸尚
すいません、仕様を勘違いしてました…
上のソースはなしということでお願いします。

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 21:22
by 幸尚
オフトピック
あと、「C言語何でも質問掲示板」と言う掲示板でこられてる質問者に対してPythonで回答するとかどうかとはおいますが…

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 23:29
by 幸尚

コード:

#include <stdio.h>
#include <string.h>

int main()
{
	char dat[15];
	char* p;
	char* pa;
	int list[15];
	int digit = 1;
	int b = 0;
	int i = 0;
	int count = 0;
	memset(dat, 0, sizeof(dat));
	memset(list, 0, sizeof(list));

	dat[0] = '1', dat[1] = ',', dat[2] = '2', dat[3] = '3';
	dat[4] = ',', dat[5] = '4', dat[6] = '5', dat[7] = '6';
	dat[8] = ',', dat[9] = '\0';

	printf("--------------------\n");
	printf("コンマありのデータ\n");
	printf("--------------------\n");
	while (dat[i] != '\0')
	{
		printf("dat[%d] = %c\n", i, dat[i]);
		i++;
	}

	p = dat;
	pa = dat;

	while (p = strchr(p, ','))
	{
		for (i = 0; i < p - pa; i++)
		{
			*pa = *(pa + i);
			int num = *pa - '0';
			b += num;
			list[count] = b;
			b *= (digit * 10);
		}

		p++;
		pa = p;
		count++;
		b = 0;
		digit = 1;
	} 

	printf("--------------------\n");
	printf("コンマなしのデータ\n");
	printf("--------------------\n");
	i = 0;
	while (list[i] != '\0')
	{
		printf("list[%d] = %d\n", i, list[i]);
		i++;
	}

	return 0;
}
出力結果

コード:

--------------------
コンマありのデータ
--------------------
dat[0] = 1
dat[1] = ,
dat[2] = 2
dat[3] = 3
dat[4] = ,
dat[5] = 4
dat[6] = 5
dat[7] = 6
dat[8] = ,
--------------------
コンマなしのデータ
--------------------
list[0] = 1
list[1] = 23
list[2] = 456
出力結果2

コード:

--------------------
コンマありのデータ
--------------------
dat[0] = 1
dat[1] = 3
dat[2] = ,
dat[3] = 3
dat[4] = 3
dat[5] = 4
dat[6] = ,
dat[7] = 6
dat[8] = ,
--------------------
コンマなしのデータ
--------------------
list[0] = 13
list[1] = 334
list[2] = 6
かなり汚く不細工なソースになり申し訳ございません。

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月16日(金) 23:41
by tsuka
ありがとうございます。こんなにすぐに解決するとは思いもしませんでした。
このプログラムは,ポインタというものを使用しているのですね?
まだまだ,そこまで私の知識が及んでいませんので,参考にさせて頂きながら勉強をすすめていきたいと思います。ありがとうございました。

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月17日(土) 09:41
by tsuka
何度も質問してすみません。
ポインタというものは,少しハードルが高くポインタを用いないで解決できるプログラムはできないでしょうか?
よろしくお願いします。

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月17日(土) 12:40
by dic
時代はPython!!

かまわーーん!

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月17日(土) 14:30
by みけCAT
tsuka さんが書きました:
1年前
ポインタというものは,少しハードルが高くポインタを用いないで解決できるプログラムはできないでしょうか?
C言語では、式中の配列はsizeofとともに用いるなどの例外を除いて先頭要素へのポインタに変換されます。
X[Y] は、*((X) + (Y)) という意味の糖衣構文(シンタックスシュガー)です。
したがって、C言語ではポインタを用いずに配列の要素にアクセスするのは無理であると考えられます。
すなわち、ポインタを用いるのを回避するためにはC言語以外を使うのがいいでしょう。

Rubyで実装してみました。

コード:

dat = []
dat[0]='1'
dat[1]=','
dat[2]='2'
dat[3]='3'
dat[4]=','
dat[5]='4'
dat[6]='5'
dat[7]='6'
dat[8]=','
dat[9]='\0'

d = []
requestNewElement = true
dat.each do |elem|
  if elem == ','
    requestNewElement = true
  elsif elem == '\0'
    break
  else
    if requestNewElement
      d << 0
      requestNewElement = false
    end
    d[-1] = d[-1] * 10 + elem.to_i
  end
end

print d

Re: カンマで区切られた文字を整数に変換したい

Posted: 2022年12月24日(土) 20:29
by あたっしゅ
東上☆海美☆「
なんだかなぁ。

まず、たしかに、『C言語何でも質問掲示板』と名乗っているけど、C 言語じゃない質問もあるので、
今は『プログラマ専用 SNS ミクプラ』の方がメインなんじゃないの ?

で、『ハードルが高い』ばかり言ってる方だが、gcc つかってるなら gdb 使ってるよね。

https://www.tohoho-web.com/ex/draft/gdb.htm
GDB 入門 - とほほの WWW 入門(ja)

ポインタを Watch して、ステップ実行すれば、理解しやすいんじゃないの ?