- ベストアンサー
マッチングの件です
- みんなの回答 (2)
- 専門家の回答
関連するQ&A
- C言語、スキャン集合について
下記のプログラムはスキャン集合を使って入力された文字列の先頭に 並んでいる数字を読み込んで捨て、その後に続く文字列を読み込んで 表示するものです。 #include <stdio.h> int main(void) { char str[80]; printf("数字に続けて文字列を入力してください\n"); scanf("%*[0-9]%s", str); printf("%s", str); return 0; } 【質問】%*[0-9] を %[^0-9] に置き換えてコンパイルして実行すると、 意味不明の文字列が出力されるのはなぜでしょうか? 置き換えても同じ結果になる気がするのですが…
- ベストアンサー
- C・C++・C#
- これで正しいのでしょうか?
文字列の先頭にNULLを付けたい時文字列の次の文字が半角の数字だった場合"\01234"とすると先頭がNULLになりませんでした。 "\0001234"としたときちゃんとNULLになり、その場合"\000こんにちわ"でも先頭はNULLでした。"\0こんにちわ"もNULLでした。\000というのは正しい使い方なのでしょうか? #include <stdio.h> int main() { char str[] = "\0009\n"; printf("%s", str+1); return 0; } ついでに質問です。"こんにちわ\n"や"おはよう\n"などの文字列の先頭にNULLを付けて初めから文字列リテラルを作りたい場合にマクロで"\000こんにちわ\n"などと置き換えたい場合、できればM("こんにちわ\n")という形で作る事は可能でしょうか? M(こんにちわ\n)を"\000こんにちわ\n"に置き換えるマクロは作れました。 #define M(str) M1(\000##str) #define M1(str) #str こんな感じなのですがもっとうまい方法はありますか? よろしくお願いします。
- 締切済み
- C・C++・C#
- 文字化けしない書き方
CString str = "%#.3f" という文字列に関して、数字部分をint valで置き換えたいなと思っています。 そこで、Formatを使って以下のように書きましたが、%#.が文字化けしてしまいます。 str.Format("%s%df", "%#.", val); 1文字ずつなら表示されるようなのですが、%#あるいは#.とやると文字化け(□)になって しまいます。なので、 str.Format("%s%s%s%df", "%", "#", ".", val); とやると、表示されるには表示されるのですが、str.Format("%s%df", ...)という書き方で 書けたらなと思っています。何か方法はないでしょうか。 よろしくお願いいたします。 環境はWindowsXP, VC2005++ &MFC です。
- ベストアンサー
- C・C++・C#
- 文字列の中間位置にマッチするアサーション表現
文字列の中間位置にマッチするアサーション表現 qr{ ^ \w+ \s+ \d+ \s+ \d+ $ }xms の規則で $strに文字列が複数行格納されています。 スペースの個数に関しては任意です。 my $str = <<EOF ; BBB 0 00 AAA 1 01 AAA 2 10 : EOF 上記例で行頭がAAAで始まる、末尾の連続した数字の先頭にマッチする正規表現を教えて頂けないでしょか? AAA 1 01 の01の先頭に位置にマッチするアサーションを知りたい 後読みを用いたいのですが、空白の数が任意のためうまく書けずに困ってます。
- ベストアンサー
- Perl
- 修正おねがいします。
コンパイルして得られる実行ファイルを list1 として、 %list1 文字列1 文字列2 ・・・ を実行すると文字列1、文字列2、・・・を連結した一つの文字列を動的に生成した領域に格納し、それをディスプレイ上に表示するプログラムを作成しようと思います。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char *argv[]) { char s[50]; int n = 0; int count = 0; char *str; if(argc < 2) puts("連結できませんでした"); else{ for(n = 1; n < argc; n++) { str = argv[n]; for(;*str != '\0'; count++) { s[count] = *str; str++; } } } s[count] = '\0'; str = malloc(strlen(s) + 1); if(str != NULL){ strcpy(str, s); printf("%s\n", s); free(str); } } これでは実行できません。どこをどう修正すべきでしょうか? また、まったく違うのであれば正しいのを教えてください。 すいません。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 明解C言語 入門編 P219 について
以下のプログラムの理解について、質問です。 入力した文字列に、0 ~ 9 の数字がそれぞれ何度含まれていたかをカウントするプログラムです。 (明解C言語 入門編 P219) ========== プログラム ========== #include <stdio.h> void str_dcount(const char str[], int cnt[]) { unsigned i = 0; while(str[i]) { // str に '\0' が現れるまで繰り返し if(str[i] >= '0' && str[i] <= '9') cnt[str[i] - '0']++; // !!!! ココです !!!! i++; } } int main(void) { int i; int dcnt[10] = {0}; char str[100]; printf("文字列を入力してください : " ); scanf("%s", str); // 文字列を str へ str_dcount(str, dcnt); // 引数 str = 入力した文字列, dcnt = すべて '0' puts("数字文字の出現回数 "); for(i = 0; i < 10; i++) printf("'%d' : %d\n", i, dcnt[i]); return 0; } ========= 実行結果 ========= 文字列を入力してください : 3.14159 数字文字の出現回数 '0' : 0 '1' : 2 '2' : 0 '3' : 1 '4' : 1 '5' : 1 '6' : 0 '7' : 0 '8' : 0 '9' : 1 ========== 質問内容 ========== 関数 str_dcount 内の 『 cnt[str[i] - '0']++; 』 がどのような処理を行っているのか、理解ができません。 以下のように考えたのですが、それでは上手く動かないとの結論に至りました。 たとえば、i = 0 で、str[100] = 3.14159 であるとき、 /* ループ1回目 */ cnt[0] = str[0] - 0; /* 3 - 0 で cnt[0] には 3 が入る。 */ cnt[0++]; /* ループ2回目 */ cnt[1] = str[1] - 1; /* "." - 1 となる。 数字ではないので減算できずエラーになるのでは? */ cnt[1++]; /* ループ3回目 */ cnt[2] = str[2] - 2; /* 1 - 2 なので、なぜか負の数になってしまう。。 */ cnt[2++]; 配列の添え字が、配列になっている cnt[str[i]] までは理解できますが、 以下の2点が解っていないために理解ができていないようです。 1) cnt[str[i] - '0']++ ; の - '0' が何を行っているのか 配列には数字が入っており、そこから文字 '0' を減算しているのでしょうか? 数字から文字を減算できるのでしょうか? 2) ++ はどの値を増加させているのでしょうか? 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- 正規表現で「円(価格)」文字列をマッチさせるには?
お世話になります。 テキストファイル(UTF-8エンコード)内の、 12,345円(価格) という文字列内より、 正規表現(ActivePerl)で、 円(価格) 文字列だけをマッチさせようとしています。 たとえば、 my $Str = "12,345円(価格)"; if($Str =~ /.*\d円(価格)/){ # マッチOK処理 } または、 if($Str =~ /円(価格)/){ # マッチOK処理 } など、いろいろ試しましたが、 マッチしない状況です。 そこでご質問ですが、 どのようにすれば、マッチ出来ますでしょうか。 以上になります。 宜しくお願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
- grepでのグルーピングの扱いについて
複数のグルーピングされた正規表現にマッチする文字列を取り出したいと思っています。 GNU awkコマンドではできるようですが、grepコマンドだけでも可能でしょうか? ■例 # 対象文字列: str="bash dash zsh" # 正規表現: re="([^ ]).+[ ]([^ ]).+[ ]([^ ]).+" # 欲しい結果(グルーピングされた正規表現にマッチする文字列) 1番目のグルーピングに対して: b 2番目のグルーピングに対して: d 3番目のグルーピングに対して: z ■環境 $ grep --version grep (GNU grep) 2.16 よろしくお願いします。
- ベストアンサー
- Linux系OS