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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

855閲覧

最後の文字が特定の文字か判定したいです。

ht3433

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1グッド

0クリップ

投稿2019/11/27 04:57

前提・実現したいこと

最後の文字が特定の文字か判定したいです。
その特定の文字は「.」です。
ソースコードのassertの内容をみればわかるとは思いますが、アドレスの最後が「23.」となっており、アドレスの表記の仕方が間違っているので、これをエラーにしたいです。
ですが、
if( strstr( src, "23." ) ){
return( 0 );
のようなソースコードしか思い浮かばず、詰まっています。
また、作成したソースコードはinet_ptonのような動きをします。
お力添えいただければ幸いです。
よろしくお願い致します。

該当のソースコード

C言語

1#include <assert.h> 2#include <arpa/inet.h> 3#include <stdio.h> 4#include <string.h> 5 6int inet_pton( const char *src, void *dst ){ 7 8 // 変数の宣言 9 int suuti1, suuti2, suuti3, suuti4; 10 11 // 共用体の型の定義 12 union number{ 13 uint32_t number1; 14 uint8_t number2[4]; 15 }; 16 17 // 共用体の変数名の宣言 18 union number No; 19 20 // srcの文字列を数値に変換し、それが4つあるか判定 21 if ( sscanf( src, "%d.%d.%d.%d", &suuti1, &suuti2, &suuti3, &suuti4 ) != 4 ){ 22 return( 0 ); 23 } 24 25 // 数値に変換したものを変数に格納する 26 No.number2[0] = suuti1; 27 No.number2[1] = suuti2; 28 No.number2[2] = suuti3; 29 No.number2[3] = suuti4; 30 31 // number1のメモリをdstにコピーする 32 memcpy( dst, &No.number1, 4 ); 33 return( 1 ); 34} 35 36int main(){ 37 int result; 38 struct in_addr in_addr; 39 40 result = inet_pton("130.0.7.23", &in_addr); 41 assert(result == 1 && in_addr.s_addr == ((23<<24)|(7<<16)|(0<<8)|130)); 42 43 result = inet_pton("130.0.7.23.", &in_addr); 44 assert(result == 0); 45 46 return(0); 47} 48
退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

最後の文字 == '.' というところに持っていけば良いです。
文字列長lはstrlenを使えば分かり、src[l]は終端文字ですから、その前の文字を比較に用います。

もし特定文字で終わっていることを確認したいなら、!strcmp(src+n, "hoge") と書きます。
事前に特定文字列がどこで始まり得るか計算する必要がありますが。

投稿2019/11/27 05:04

編集2019/11/27 05:21
LouiS0616

総合スコア35660

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

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

LouiS0616

2019/11/27 05:09 編集

@低評価を付けた方 回答に間違いがあるのであればご指摘のほどよろしくお願いします。
ht3433

2019/11/27 05:13

回答していただき、ありがとうございます! int len = strlen( src ); と宣言してsrcの長さをはかり、 if( src[len -1] == '.' ){ return( 0 ); } で終端文字の一つ前を指定するとうまくいったのですが、こんな感じでよろしいでしょうか
LouiS0616

2019/11/27 05:16

sscanf以降の行であればlenが0より大きいことが既に分かっているので、それで問題無いように思います。 それより前の行に書くのなら少し配慮が必要です。
ht3433

2019/11/27 05:21

回答していただき、ありがとうございます! 確かにおっしゃるとおりですね。 本当にありがとうございました!
dodox86

2019/11/27 05:36

「考え方を提示されている」と言うことで高評価させていただきましたが、低評価の方の理由は分かりませんね。間違いがあるとは思えません。
LouiS0616

2019/11/27 05:45 編集

@dodox86 さん コメントありがとうございます。 おっしゃるとおり考え方を伝える意図を含んだ回答ですので、そのように評価していただき嬉しく思います。 低評価の理由は何なのでしょうね。文字列長が0の場合領域外に突っ込んで未定義動作を踏むだとか、そういう心配かもしれませんが、それならばコメントを残して貰えると良かったのですけどね。マサカリ大歓迎なのに。
LouiS0616

2019/11/27 05:49 編集

※勘違いの可能性が高いため撤回します。
退会済みユーザー

退会済みユーザー

2019/11/27 05:51 編集

コメント失礼します。 すみませんでした。低評価を押したのは私です。私は高評価を押したつもりでしたが、なぜか低評価になっていました。(多分押し間違いかと・・・)失礼いたしました。高評価押します。 本当にすみませんでした。 LouiS0616さんが提示されているもう一つの回答には低評価は押していません。一応報告でした。 では、失礼します。
LouiS0616

2019/11/27 05:49

@tonko さん ミスは誰にでもありますからお気になさらず。
退会済みユーザー

退会済みユーザー

2019/11/27 05:51 編集

ありがとうございます。LouiS0616さんが優しい方でよかったです。
guest

0

最後の文字をえる関数です
こんな感じでどうでしょう?

char right(char *str){ int len = strlen(str); return 0 < len ? str[len - 1] : '\0'; }

投稿2019/11/27 05:04

編集2019/11/27 05:05
izmktr

総合スコア2856

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

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

0

参考情報

  • C言語-ソケットプログラミング_IPアドレス表記の変換

http://capm-network.com/?tag=C%E8%A8%80%E8%AA%9E-%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0_IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E8%A1%A8%E8%A8%98%E3%81%AE%E5%A4%89%E6%8F%9B

  • インターネットアドレス操作ルーチン

https://kazmax.zpp.jp/cmd/i/inet.3.html

...
inet_aton () は、インターネットホストのアドレス cp を 「数値とドット」記法からバイナリ値へ変換する。 結果は inp が指している構造体に代入される。 返り値は、指定したアドレスが正当ならば 0 以外、不当なら 0 である。
...

投稿2019/11/27 14:44

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問