• ベストアンサー

文字列の操作

tenkuuryuuの回答

回答No.1

文字の開始ポイントを抑えておいて、strcpyではだめでしょうか? または、strlenで文字数を数えておいてmemcpyとか。

bird0214
質問者

お礼

返信ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • WinSock2。ナル文字をソケットに含めるには?

    C言語を学び始めて間もないのですが、ggってもヒットしなかった疑問があるので質問させていただきます。 用語が間違っていたらすみません。 WinSock2を用いてソケットを送信するプログラムを作っています。 末尾にナル文字のつく内容を、ナル文字含めて送信したいのですが、上手くいきません。 ソケット作成⇒コネクト⇒ _snprintf(buf, sizeof(buf), "XXXXX\0\0"); send(sock, buf, (int)strlen(buf), 0); 送信部分はこのようになっています。 パケットモニタで監視してみたところ、「XXXXX」が送信されていました。 Perlで同様なものを組んだところ、「XXXXX\0\0」が送信されています。こちらが送りたい内容なのですが・・・ 確かにCではナル文字を文字列の末尾と認識しますが、 ナル文字も文字列の一部として一緒に送信させてあげることはできますか? わかりにくい説明ですみませんが、宜しくお願いします m(__)m

  • C言語で文字列をポインタ名にしたい

    C言語で文字列をポインタ名にしたい 題名のとおりですが、C言語で文字列をポインタ名にする方法はありますか? 具体的にはxの配列の個々の要素を、計算回数による計算結果の推移をファイルに出力したいと考えています。 ファイル名は「test_x_1.data」、「test_x_2.data」、…「test_x_50.data」のようになっています。 (要素分のファイルを作成するということです。) ここでそれぞれの「test_x_1.data」、「test_x_2.data」、…「test_x_50.data」には、 x[i]の計算回数と計算結果が格納されていますが、 現状では、fopenとfcloseを計算回数分繰り返しているため、計算時間がかかってしまっています。 よって、計算を行う前の最初にfopen、最後にfcloseを行うようにしたいのですが、 ファイルポインタを開く作業を手動で行うと、xの要素分ファイルポインタを用意しなくてはならなくなります。 (現状のようにファイルポインタを使いまわすのではなく、 要素分(=ファイル数)のファイルポインタを、常に開きっぱなしにしたいということです。) そのため、文字列をポインタ名にすることで、その作業を自動で行えるようにできればと考えています。 実際にchar型の配列が文字列になっているため、「FILE *buf」のように宣言しようと試みたのですが、 bufは既に文字列型の配列として宣言されているため、使用することができませんでした。 (文字列そのものをファイルポインタ名にできなくても、 この場合、要素数分のファイルポインタを自動で用意できれば問題ないのですが…) 下は簡単なプログラム例です。詳しい方のご助言を戴ければ幸いです。 よろしくお願い致します。 -------------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <math.h> #define CAL 10000 /*計算回数*/ #define ELE 50 /*配列の要素数*/ #define NUM_CHAR 20 /*char型で確保する文字数*/ int i,j,n; /*forループ用*/ double x[ELE]; /*計算結果の配列*/ char buf[ELE][NUM_CHAR]; /*文字列*/ int main(void){ char filename[] = "test_x_"; char fileext[] = ".data"; /*「test_x_数字.data」という文字列の出力*/ for(i=0;i<ELE;i++){ sprintf(buf[i],"%s-I%d%s",filename,i,fileext); } for(n=1;n<CAL;n++){ /*計算部分*/ for(i=0;i<ELE;i++){ x[i] = 2*n+i; } /*ファイルに出力*/ for(i=0;i<ELE;i++){ FILE *fp; /*このファイルポインタ名を要素数分用意したい*/ if(n==1){ if((fp = fopen(buf[i],"w"))==NULL){ printf("The program can't create a file. : buf[i] \n"); exit(1); } } if(n>=2){ if((fp = fopen(buf[i],"a+"))==NULL){ printf("The program can't read a file. : buf[i] \n"); exit(1); } } fprintf(fp,"%d %f\n",i,x[i]) fclose(fp); } } return 0; } --------------------------------------------------------------------------------

  • 文字列の表示

    環境 WIN98 VC++6.0 MFC にて よろしくお願いします。 while((fgets(buf,256,fin))!=NULL) { n=strlen(buf); buf[n-1]='\0'; 略 } 上記のようにしてファイルから1行ずつ読み込み表示させる場合、 AfxMessageBox(buf);では正しく表示されますが、 クライアント領域にdc.DrawText( buf,cr, DT_SINGLELINE | DT_VCENTER | DT_CENTER);で表示させると文字列の最後に文字化けした1文字が追加されてしまいます。 このような場合どのように対処すれば良いのでしょうか?

  • バイナリファイルの操作(配列の操作について)

    こんにちは。 大変お世話になっております。 配列要素の先頭[0]から[5]までを文字列N、[6]から[1029]までをバイナリデータの計1030バイトの配列要素を使用しています。 [現在行なっている操作方法] 1. Buf[1500]とBuff[1500]を用意 2. fread関数により、Bufに1024バイトずつ格納 3. sprintf関数により、Buffの先頭[0]から[5]まで文字列挿入 4. strcat関数により、BuffとBufを結合 と言う形をとっています。 そこで、sprintfにて先頭から[5]までの文字列を挿入後、先頭から[5]までの配列要素を削除(不要になるため)し、バイナリデータのみにしたいのですが、何か方法はありますでしょうか? NNNNNNDDDDDDDDDDDDDDDDD・・・・・DDDDD←1029番 から NNNNNNを削除し、 DDDDDDD・・・・・DDDDD のみにしたいと思っています。 よろしくお願いします。

  • Basicでの文字列操作

    いつもお世話になっております。 ActiveBasicを使いBasic(http://ja.wikipedia.org/wiki/BASIC) の勉強をしております。下記の動きをするプログラムを作りたい場合はどうすれば良いでしょうか? 便利な関数や方法がありましたら教えてください。 お願いいたします。 ユーザが入力した数の分だけザイズ11の配列を作成し 例:ユーザが3と入力したら Dim x$(3)[11] 作成した配列に文字列を入れていき x$(0)="文字列01|01" x$(1)="文字列02|02" x$(2)="文字列03|03" 画面に文字列を奇数番目なら"|"から前の文字列を表示 偶数番目なら"|"より後の文字列を表示する 文字列01 02 文字列03

  • 指定した文字列を探して・・・

        第1引数の文字列中に第2引数で指定した文字がある場合に、その     文字のあるアドレス(ポインタ)を返す関数doko()作成し、     プログラムを完成させよ。     指定した文字がない場合はNULL(ヌルポインタ)を返すものとする。     配列の[](カギカッコ)を利用しないで作る事     main内は変えないこと いろいろと模索したのですが、strcpyなどは使うのでしょうか? 参考サイトを見たりしたり、ほかの質問などを見たのですが なかなか理解できずに現在にいたってます 以下のコードのdokoは沢山やりすぎたので一番シンプルな間違い方をしています 何かご指摘あればお願いします #include <stdio.h> #define MAX 128 char* doko(char *,char); int main() { char buf[MAX]; char *p = "abcdef12345"; char *r; r = doko(p, 'f'); if (r == NULL) { printf("mojiretsu ni f toiu moji ha arimasen\n"); return 0; } printf("%s (= f12345)\n", r); scanf("%s", buf); r = doko(buf, 'x'); if (r == NULL) { printf("mojiretsu ni x toiu moji ha arimasen\n"); return 0; } printf("%s\n", r); return 0; } char* doko(char *p,char a) { while(*p){ if(*p == a){ return p; } if(*p != a){ return NULL; } ++p; } }

  • 抜け落ちている番号を取得する方法(Winsock利用)

    こんにちは。 A→Bというように、 送信端末Aから受信端末Bへパケットを送信する際に、sprintf関数を用いて、各送信パケットに対してナンバリングを行っています。 そして、受信端末において取得することができた番号と抜け落ちている番号を取得したいと思っています。 以下に、プログラムの概要を示します。 [送信側] char send_Buff[1500]; int sequence_Num = 0; //シーケンス番号のカウントアップ sequence_Num++; //sprintf関数にて、文字列格納 sprintf(send_Buff,"%d\0",sequence_Num); sendto関数を使用し、送信 [受信側] recv_Buf[1500]; int x; unsigned int count = 0; recvfrom関数にて送信端末からのパケットを受信し、recv_Bufに格納 count++; //recv_Bufの先頭要素からナル文字までを走査し、ナル文字をみつけたらナル文字の手前の要素までをreceive_seq_Numに格納 for(x=0;recv_Buf[x]!='\0';x++){  receive_seq_Num[count][x] = recv_Buf[x]; } 上記プログラムのように、記述したのですが・・・ [分からない点] 受信側にて、受信することができた各パケットのシーケンス番号のみを配列内に格納したいのですが、上記の記述方法で可能でしょうか? また、配列内に格納したシーケンス番号から抜け落ちているシーケンス番号を割り出したいのですが、どのような記述方法がありますでしょうか? 受信シーケンス番号;1,2,3,4,5,7,10,11,20,21,22・・・ 抜け落ちているシーケンス番号:6,8,9,12,13,14,15,16,17,18,19 ということです。 よろしくお願いします。

  • ファイルから文字を読み込んで文字列を変換する

    ファイルから文字を読み込んで文字列を変換したいのですが 読み込み元が改行されていた場合がうまく変換できません。 読み込み元が改行されている事を教えればうまく行くと思うのですがどのようにすれば出来ますか? 出来ればソースの書き込みお願いします。 ---以下ソース--- #include <stdio.h> #include <stdlib.h> #include <string.h> int hen(char *buf, char *mae, char *ato); void main(void){ FILE *fp; char *f1="赤<br>と<br>白<br>"; char *h1="黄と黒"; char buf[200]; char set[200]; fp = fopen("ren2.html", "r+"); while( fgets( set, 200, fp ) != NULL ){ strcpy(buf,set); while(hen(buf, f1, h1)); printf("%s", buf); } fclose(fp); } int hen(char *buf, char *mae, char *ato){ char *nw; size_t zen,go; zen = strlen(mae); go = strlen(ato); if(zen == 0 || (nw = strstr(buf, mae)) == NULL){ return 0; } memmove(nw + go, nw + zen, strlen(buf) - (nw + zen - buf ) + 1); memcpy(nw, ato, go); return 1; } ---ソースここまで--- ---ren2.htmlの内容--- <html> <head> <title>練習</title> </head> <body> 赤<br> と<br> 白<br> </body> </html> ---ren2.htmlここまで---

  • 文字コードから文字列への変換

    よくわからないタイトルですみません(汗。 標準入力からデータを渡すと、I/Oをしてくれるというモジュールを書いているのですが、当初、テキストのみの設計のつもりだったのが、バイナリを扱うはめになってしまいました。 それで、バイナリはstdinから読めなさそうだったので、0xXYZという文字列にしてからstdin経由で渡そうと思ったのです。 今回の質問は、その文字列で書かれた16進コードを文字に直す方法なのです。 つまり、char buf[80] = "0x414243"という文字列を渡した場合、char buf2[80] = "ABC" という文字列を得たいのです。(0x41="A") 変な希望ですが、何通りか試したのですが、根っからのテキスト処理大好きPerl人間なので、Cの知識の無さに挫折してしまいました。 アドバイスをよろしくお願いいたします。

  • 文字列の比較

    char *c; scanf("%s",c); で文字列を取得し、もし exit と入力したとき if(/*ココ*/)return(0); としてプログラムを終わらせたいのですが、 /*ココ*/ の部分を c[0]='e' &&c[1]='x' &&c[2]='i' &&c[3]='t' &&c[4]='NULL' とするほかに方法はありますか? c=="exit"ではできませんでした。