- ベストアンサー
文字列の操作
こんにちは。 以下のような、文字列があるとします。 NUMBER1(ヌル\0)からNUMBER1000(ヌル\0)までの文字列があるとします。 NUMBERは付属で、ほしい文字列が1から1000までNUMBERの次にある場合、1から1000までを取得する方法として、 Buf[100] int x=0; while(Buf[x]!='\0') //ナル文字までの長さを取得 x++; memmove(&Buf[0],Buf[x-1],4); //NUMBER1の場合、長さは7。しかしほしい文字列は第6要素なのでx-1。 しかし・・・これを行うと、 NUMBER10:長さ8 NUMBER100:長さ9 ・ ・ となり、二桁以上の場合は、memmove(&Buf[0],Buf[x-2],4)と、 第2引数を手動で可変しなければなりません。 そこで、NUMBER\01\0 NUMBER\01000\0というように、 NUMBERの次にヌル文字(あってますでしょうか?)\0を挿入し、次の要素に1から1000まで文字列を挿入。そして文字列終端が分かるように再度\0を挿入します。 しかしこのような場合、ヌルを2つ挿入することで、上記に示したプログラムでは、手前の\0までしか長さを取得しないので、うまくいきません。 そこで、文字列の区切りを示すための方法として、なにかありますでしょうか? 文字列は最後に、\0を挿入することで判別すると書いてありますが、 NUMBERVISUALC++\0というような文字列を配列に格納してある場合、 NUMBERとVISUALC++をどのように分けて取得するのでしょうか? それとも、第6要素から取得した文字列があると言う事が分かっている場合、第6要素からを指定するプログラムを作るということになるのでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
最初の固定文字を削除するだけであれば、sscanf() が使えます。 #include <stdio.h> で、 char *str = "MEMBER1000"; char buff[1000]; であれば、 sscanf(str, "MEMBER%s", buff); で、MEMBER の後の部分を buff に取得できます。 もちろん、 int n; なら、 sscanf(str, "MEMBER%d", &n); で数値として取得できます。
その他の回答 (3)
頭の"NUMBER"が固定なら、こんなコードを拡張したもので十分かと思います。 #include <stdio.h> #include <stdlib.h> int main(void) { char *str[] = { "NUMBER1", "NUMBER10", "NUMBER100", "NUMBER1000", }; int n, i; for (i = 0; i < sizeof(str) / sizeof(str[0]); i++) { n = atoi(str[i] + 6); printf("n=%d\n", n); } return 0; }
お礼
返信ありがとうございました。 お礼の書き込みが遅くなり申し訳ありません。 今後ともよろしくお願いします。
- Werner
- ベストアンサー率53% (395/735)
やりたいことは "NUMBER****" という文字列から"****"を取得したいということですか? NUMBERの文字数が分かっているなら そこをとばすだけでよいと思いますが。 char str1[]="NUMBER12"; char str2[]="NUMBER345"; printf("%s\n%s\n", str1+6, str2+6) > memmove(&Buf[0],Buf[x-1],4); //NUMBER1の場合、長さは7。しかしほしい文字列は第6要素なのでx-1。 なぜ素直に、&Buf[6]としないのでしょう?その場合必ず6なんですよね? なお、第2引数はポインタなので&が必要です。(Buf+6も可) > 上記に示したプログラムでは、手前の\0までしか長さを取得しないので、うまくいきません。 \0の次から読むようにしないと。 char str[]={'N','U','M','B','E','R','\0','3','4','5','\0'}; char *p=str; printf("%s\n", p); while(*p != '\0'){p++;} p++; printf("%s\n", p);
お礼
返信ありがとうございます。 お礼が遅くなり申し訳ございません。 >なぜ素直に、&Buf[6]としないのでしょう?その場合必ず6なんですよね? 拡張性を持たせるため、たとえばNUMBERという文字列をNUMBERSと一文字増やしたりした場合、&Buf[6]から&Buf[7]へ変更しなければならないと思ったからです。 ありがとうございました。
- tenkuuryuu
- ベストアンサー率30% (26/86)
文字の開始ポイントを抑えておいて、strcpyではだめでしょうか? または、strlenで文字数を数えておいてmemcpyとか。
お礼
返信ありがとうございます。 参考にさせていただきます。
お礼
返信ありがとうございます。 sprintfで文字列を配列内へ格納しているため、sscanfを用いれば文字列を取り出すことが可能なのですね。 ありがとうございました。