部分文字列を置き換えする方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
トマト

部分文字列を置き換えする方法

#1

投稿記事 by トマト » 15年前

IPアドレスを全て3文字づつにするやり方を教えてください

何度もお世話になり本当にその際はありがとうございました。

iso.3.6.1.2.1.4.22.1.2.1061.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C2
iso.3.6.1.2.1.4.22.1.2.1061.193.168.61.178 = Hex-STRING: 00 24 EF 5A 1E F0

を以下に切り出す処理を入れています。
193.168.60.16,00 1B 8D CC 12 C2
193.168.61.178,00 24 EF 5A 1E F0

ですが、IPアドレスの不ぞろいな為「iso.3.6.1.2.1.4.22.1.2.1061.」があったら
193.168.60.16だけにするとの処理なのですが
必ずしも「iso.3.6.1.2.1.4.22.1.2.1061.」が一字一句同じなものがあまりないため
汎用的にするため、文字列の長さを同じにしたいのです。

「iso.3.6.1.2.1.4.22.1.2.1061.」
「iso.3.6.1.2.1.4.22.1.2.132.」
「iso.3.6.1.2.1.4.22.1.2.3.」とまちまちな為「192.」があったら

「193.168.60.16」-> 「193.168.060.016」
「193.168.61.178」-> 「193.168.061.178」
とする。
のようにするには、どうしたらいいのでしょうか?

大変申し訳ありませんが、もうずっと出来なくてなやんでしまいこちらに相談にきました
よろしくお願いいたします

シエル

Re:部分文字列を置き換えする方法

#2

投稿記事 by シエル » 15年前

>>ですが、IPアドレスの不ぞろいな為「iso.3.6.1.2.1.4.22.1.2.1061.」があったら
>>193.168.60.16だけにするとの処理なのですが
>>必ずしも「iso.3.6.1.2.1.4.22.1.2.1061.」が一字一句同じなものがあまりないため
>>汎用的にするため、文字列の長さを同じにしたいのです。
>>「iso.3.6.1.2.1.4.22.1.2.1061.」
>>「iso.3.6.1.2.1.4.22.1.2.132.」
>>「iso.3.6.1.2.1.4.22.1.2.3.」とまちまちな為「192.」があったら
>>「193.168.60.16」-> 「193.168.060.016」
>>「193.168.61.178」-> 「193.168.061.178」
>>とする。

この辺の意味が良く分かりません。

まあIPを3文字にして、頭に0をつけたいのであれば、
「.」を区切り位置として、フォーマット指定子を駆使すれば、何とかなるのではないでしょうか?

Poco

Re:部分文字列を置き換えする方法

#3

投稿記事 by Poco » 15年前

参考になるか分かりませんが、プログラム載せておきます。

#SNMP-Trapメッセージの解析と言ったほうが、伝わると思いますよ。

----hoge.c----
#include <stdio.h>

char oid[/url] = "iso.3.6.1.2.1.4.22.1.2.";

char * snmpTrapMsg[/url] = {
"iso.3.6.1.2.1.4.22.1.2.1061.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C2",
"iso.3.6.1.2.1.4.22.1.2.1061.193.168.61.178 = Hex-STRING: 00 24 EF 5A 1E F0",
NULL,
};


int main()
{
int offset = sizeof( oid ) - 1;
int dummy = -1;
int firstOctet = -1;
int secondOctet = -1;
int thirdOctet = -1;
int forthOctet = -1;
char ** p = snmpTrapMsg;

for ( ; *p; p++ ) {
sscanf( &(*p)[offset], "%d.%d.%d.%d.%d", &dummy, &firstOctet, &secondOctet, &thirdOctet, &forthOctet);
printf("IP addres = %03d.%03d.%03d.%03d\n",firstOctet, secondOctet, thirdOctet, forthOctet);
}
}

トマト

Re:部分文字列を置き換えする方法

#4

投稿記事 by トマト » 15年前

分かりにくくて申し訳ありません。

貰っている指示は、
iso.3.6.1.2.1.4.22.1.2.1061.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C2
iso.3.6.1.2.1.4.22.1.2.1061.193.168.61.178 = Hex-STRING: 00 24 EF 5A 1E F1
iso.3.6.1.2.1.4.22.1.2.9.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C3
iso.3.6.1.2.1.4.22.1.2.1029.193.168.61.178 = Hex-STRING: 00 24 EF 5A 1E F2
iso.3.6.1.2.1.4.22.1.2.1030.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C4
iso.3.6.1.4.1.3224.17.1.3.1.2.0 = IpAddress: 193.168.60.16
iso.3.6.1.4.1.3224.17.1.3.1.3.0 = STRING: 00 1B 8D CC 12 C2
iso.3.6.1.2.1.4.22.1.2.4.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C5

上記ログ情報を
193.168.60.16,00 1B 8D CC 12 C2
193.168.61.178,00 24 EF 5A 1E F1
193.168.60.16,00 1B 8D CC 12 C3
193.168.61.178,00 24 EF 5A 1E F2
193.168.60.16,00 1B 8D CC 12 C4
193.168.60.16,00 1B 8D CC 12 C5
にする事です。
iso.3.6.1.4.1.3224.17.1.3.1.2.0 = IpAddress: 193.168.60.16
iso.3.6.1.4.1.3224.17.1.3.1.3.0 = STRING: 00 1B 8D CC 12 C2
IPアドレスだけ、MACアドレスだけの情報は捨てる事。

だそうです。
今は、エクセルの置換みたいにしていますが、記述が多くてとんでもないプログラムになってしまいました。
どうしたらスムーズに処理できるのでしょうか。
何をどうしたら部分文字列の切り出しができるかわからない状態になってしまいました。

ぽこ さん、サンプルありがとうございました。
やってみます。

そして、
>#SNMP-Trapメッセージの解析と言ったほうが、伝わると思いますよ。

アドバイスありがとうございます。
ログを渡されているだけなので、このデータは何ぞや って感じでした。

トマト

Re:部分文字列を置き換えする方法

#5

投稿記事 by トマト » 15年前

文字列の途中にある192.168.・・・
をみつけたら文字列から切り出す方法は何かないでしょうか?

申し訳ないですが、どなた様か知恵を貸してくださりませんでしょうか?

シエル

Re:部分文字列を置き換えする方法

#6

投稿記事 by シエル » 15年前

strstrを使ってみてはどうでしょうか

ideyan

Re:部分文字列を置き換えする方法

#7

投稿記事 by ideyan » 15年前

ある程度文字列の書式が決まっているのだから
'=' を起点に '.' が4つ出てくるまで
長さをカウントしながら文字列を走査していって、
strncpyで一気にコピーするような愚直な方法じゃダメですかね?

トマト

Re:部分文字列を置き換えする方法

#8

投稿記事 by トマト » 15年前

strstrで切り出せました。
ありがとうございます! 

閉鎖

“C言語何でも質問掲示板” へ戻る