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

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

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

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

Q&A

解決済

4回答

2402閲覧

C/C++ 特定の文字と文字の間を取得させたい。

keta

総合スコア4

C++

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

0グッド

0クリップ

投稿2020/05/16 23:06

C/C++

ご観覧有難うございます。

今回質問したい内容は 変数に入っている中の 特定の文字と文字の間の文字を取得したいといことになります。

例としては  &k3e:7=12345&k87e:  この "&k3e:7=" と "&k87e:" の間の文字を取りたいと思います。
毎回間の文字数は変わりますが、特定の文字は変わりません。
経験不足で申し訳ないのですが、ソースコードなどを教えて頂けると幸いでございます。 宜しくお願いします。

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

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

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

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

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

guest

回答4

0

C

1#include <stdio.h> 2 3int get(const char *s, char *t) 4{ 5 char c; 6 if (sscanf(s, "&k3e:7=%[^&]&k87e%c", t, &c) == 2 && c == ':') return 1; 7 *t = '\0'; 8 return 0; 9} 10 11int main(void) 12{ 13 char buf[1024]; 14 if (get("&k3e:7=12345&k87e:", buf)) puts(buf); 15 if (get("&k3e:7=1234567&k87e:", buf)) puts(buf); 16 if (get("&k3e:7=abcdefg&k87e:", buf)) puts(buf); 17}

ちょっと問題がありますが。

追記
大きな問題がありました。
&k3e:7= が先頭にあるわけでなないのですね。
勘違いしていました。すみません。

追記2
sscanf を使うのには問題があったので、strstr を使う方法を示します。

C

1#include <stdio.h> 2#include <string.h> // strstr, memcpy 3 4int get(const char *s, char *t) 5{ 6 const char *p = strstr(s, "&k3e:7="); 7 if (!p) return 0; 8 p += 7; // 7 = strlen("&k3e:7="); 9 const char *q = strstr(p, "&k87e:"); 10 if (!q) return 0; 11 int n = q - p; 12 memcpy(t, p, n); 13 t[n] = '\0'; 14 return 1; 15} 16 17int main(void) 18{ 19 char buf[1024]; 20 if (get("&k3e:7=12345&k87e:", buf)) puts(buf); 21 if (get("&k3e:7=1234567&k87e:", buf)) puts(buf); 22 if (get("&k3e:7=abc&def&k87e:", buf)) puts(buf); 23}

投稿2020/05/17 03:42

編集2020/05/17 12:58
kazuma-s

総合スコア8224

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

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

0

こんなんで。

C++

1#include<iostream> 2#include <string> 3 4int main(void) { 5 using namespace std; 6 string str = "&k3e:7=12345&k87e:"; 7 string from = "&k3e:7="; 8 string to = "&k87e:"; 9 string::size_type spos = str.find(from); 10 if ( spos != string::npos ) { 11 string::size_type epos = str.find(to, spos+from.length()); 12 if ( epos != string::npos ) { 13 string between = str.substr(spos+from.length(), epos - spos - from.length()); 14 cout << between << endl; 15 } 16 } 17}

投稿2020/05/17 00:04

episteme

総合スコア16612

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

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

0

ベストアンサー

C言語関数辞典の、sscanf(),strchr(),strstr()あたりを参考に。
自力で解いて、詰まったら質問に追記して下さい。
推奨していない質問

BAをもらっちゃいましたが・・・**こんな方法も有る!**という事で、参考になれば・・・

c

1#include <stdio.h> 2#include <string.h> 3 4int main( ) 5{ 6 const char src[] = "&k3e:7=12345&k87e:"; 7 char value[10]; 8 9 if(sscanf(src, "&k3e:7=%[^&]&k87e:", value) != 1) { 10 return 1; 11 } 12 puts(value); 13 14 return 0; 15}

usr ~/Project/test % ./a.out
12345
usr ~/Project/test % echo $?
0

c

1#include <stdio.h> 2#include <string.h> 3 4int main( ) 5{ 6 const char src[] = "abc &k3e:7=123&5&k87e:"; 7 char value[16]; 8 9 const char *sp = strstr(src,"&k3e:7="); 10 11 if(sscanf(sp, "&k3e:7=%s", value) != 1) { 12 return 1; 13 } 14 *strstr(value, "&k87e:") = '\0'; 15 puts(value); 16 17 return 0; 18}

usr ~/Project/test % ./a.out
123&5

投稿2020/05/16 23:54

編集2020/05/17 13:42
cateye

総合スコア6851

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

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

keta

2020/05/16 23:56

わかりました。ありがとうございます。
kazuma-s

2020/05/17 12:46

const char src[] = "&k3e:7=12&45&k87e:"; だったとしましょう。 "&k3e:7=" と "&k87e:" の間の文字列は "12&45" ですね。 cateye さんのやり方では "12" しか取れません。 "&k87e:" のチェックをやっていません。
cateye

2020/05/17 13:16 編集

先頭にない場合や、ご指摘の対応として追記しました。
guest

0

  1. 文字列の中から、"&k3e:7="の位置を求める
  2. 文字列の中から、"&k87e:"の位置を求める
  3. 1と2から、その間の文字/文字列を得る

#残念ながら、コードの作成依頼は受け付けていません。

投稿2020/05/16 23:18

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問