C言語関係掲示板

過去ログ

No685 文字列操作

[戻る] [ホームページ]
No.7843

文字列操作
投稿者---健太郎(2003/06/29 16:28:49)

char *型で宣言したdataに データが入ってます。
dataの内容は G01B123/456 のようなものです。
このデータを出力させる際
[G01B123/456] → [G01B 123/456]
[G14A23/45] → [G14A 23/45]
[B11C2/3] → [B11C 2/3]
[G01B123:456] → [G01B 123:456]
[G14A23:45] → [G14A 23:45]
[B11C2:3] → [B11C 2:3]
[B12G12345]  → [B12G 123]
のように、 頭4文字以降に半角スペースを入れ
'/' または':'の前の数字を桁あわせをして
表示させるプログラムを作りたいんですが
よくわからないんです。
おしえてください。


No.7844
Re:文字列操作
投稿者---nop(2003/06/29 16:56:35)
>char *型で宣言したdataに データが入ってます。
>dataの内容は G01B123/456 のようなものです。

「char *」型は「charへのポインタ」型であり、
「G01B123/456」の様なデータは入りません。
文字列を入れるには「char」型の配列を用いるか、
malloc()/calloc() などにより、
十分な容量の記憶領域を確保し、そのポインタを保存するなりして下さい。

>頭4文字以降に半角スペースを入れ
>'/' または':'の前の数字を桁あわせをして

あなたが言う「桁合わせ」の定義がわかりません。
挙げられた例は、
変換の形式に規則性は一部除いては規則性がありますが、
最後のもののみ、説明文と変換結果が一致しません。

まずは、仕様をハッキリさせましょう。

No7845

Re:文字列操作
投稿者---健太郎(2003/06/29 20:34:19)

>>char *型で宣言したdataに データが入ってます。
>>dataの内容は G01B123/456 のようなものです。
dataの内容は、G01B123/456 のような文字型の配列です。

>あなたが言う「桁合わせ」の定義がわかりません。
桁あわせの定義として、
頭4桁+半角スペース+頭4桁から'/'または':'の前までの文字列を
3桁に桁あわせします。
最後の例は、 '/'も':'もない場合で
この場合は、元のデータの頭から7桁を出力させます。
よって、
[G01B12345] → [G01B 123]
となるそうです。
よろしくおねがいします。


No.7846

Re:文字列操作
投稿者---こん!(2003/06/29 20:54:56)

>>>char *型で宣言したdataに データが入ってます。
>>>dataの内容は G01B123/456 のようなものです。
>dataの内容は、G01B123/456 のような文字型の配列です。

nopさんのレスをちゃんと理解するようにしてください。
この3行(既に前の2行だけでも)理屈にあいませんと言っているのです。

もう一度<A HREF="http://www9.plala.or.jp/sgwr-t/c/sec02.html#s2-4">http://www9.plala.or.jp/sgwr-t/c/sec02.html#s2-4</A>をよくお読み
になって再度自分の投稿の意味を考え直してみてください。
ちなみに char* data; とはポインタ変数であり文字列を格納出来る変数ではあ
りません。<A HREF="http://www9.plala.or.jp/sgwr-t/c/sec10-2.html">http://www9.plala.or.jp/sgwr-t/c/sec10-2.html</A>を参照してみてください。

どうしても『dataの内容は、G01B123/456 のような文字型の配列です』と言い切
るのであれば誰もそれ以降の回答を付けることが出来ないと思いますよ。


No.7848

Re:文字列操作
投稿者---健太郎(2003/06/29 21:58:19)

>>dataの内容は、G01B123/456 のような文字型の配列です。
文字型の配列のアドレスです。
すみません


No.7851

Re:文字列操作
投稿者---健太郎(2003/06/29 22:25:46)

今、作ったソースコードです。
lpszGetの中身がデータのアドレスです。
/********************************************
********************************************/
char *getDispData(char **lpszGet)
{
char *ipcnum; /* 変換した文字列を格納 */
char *cnt; /* 文字数のカウント */
int i;

/* 変換用メモリの確保 */
ipcnum = (char *)malloc(15);
if(ipcnum == NULL){
printf("変換用のメモリを確保できませんでした");
return(NULL);
}
/* ipc変換格納領域初期化 */
memset(ipcnum, '\0', 15);

strncat(ipcnum, *lpszGet, 4);
strcat(ipcnum, " ");
cnt = strstr(*lpszGet, "/");
i = cnt - *lpszGet;
/* '/'より前が7文字の場合 */
if(i == 7){
strcat(ipcnum, *lpszGet+4);
  /* '/'より前が6文字の場合 */
}else if(i == 6){
strcat(ipcnum, " ");
strcat(ipcnum, *lpszGet+4);
/* '/'より前が5文字の場合 */
}else if(i == 5){
strcat(ipcnum, " ");
strcat(ipcnum, *lpszGet+4);
}
/* 戻り値としてipcnumのアドレスを返す */
return(ipcnum);
}
/*************************************
*************************************/
static void printjpGaz(gPatPtr cur)
{
char     *lpszGet; /* コード変換ワーク*/
ipcptr further; /* 構造体のポインタ*/
char *ipcnum; /* 変換領域*/

/* 画面表示項目構造体ポインタが設定されていなければ処理しない */
if (cur == NULL) return;

/* 詳細分類の出力 */
further = &cur->ipc_further;
while(further->next != NULL){
/* 次のリストへ */
further = further->next;
if (further->ipc_no){
lpszGet = NULL;
/* コード変換 */
if( iconv_UTF8_EUC( (char *)further->ipc_no, &lpszGet) == 1 ){
ipcnum = getDispData(&lpszGet);
printf(" 詳細分類: [%s]\n", ipcnum );
fprintf(fp, " 詳細分類: [%s]\n", ipcnum );
free( lpszGet );
}
}
}
/* 確保した領域を解放 */
while(further->parents != NULL){
/* 親のリストへ移動 */
further = further->parents;
/* 次のリストを解放 */
free(further->next);
}
}
こんな感じです。
これだと'/'はあるものの、':'の処理と
'/'または':'がない場合の処理がないんですよねぇ・・・

作業環境は UNIXです。

No.7861

Re:文字列操作
投稿者---かずま(2003/06/30 01:37:18)

> 桁あわせの定義として、
> 頭4桁+半角スペース+頭4桁から'/'または':'の前までの文字列を
> 3桁に桁あわせします。 > 最後の例は、 '/'も':'もない場合で
> この場合は、元のデータの頭から7桁を出力させます。
#include <stdio.h>

void edit(const char *data, char *result)
{
    char s1[5], s2[4], s3[256];  int n;

    s1[0] = s2[0] = s3[0] = '\0';
    n = sscanf(data, "%4s%3[^/:]%255s", s1, s2, s3);
    if (n == 3 && s3[0] != '/' && s3[0] != ':') s3[0] = '\0';
    sprintf(result, "%s %3s%s", s1, s2, s3);
}

int main(void)
{
    char buf[256],  buf2[256];

    while (gets(buf)) {
        edit(buf, buf2);
        printf("[%s] --> [%s]\n", buf, buf2);
    }
    return 0;
}

No7863

Re:文字列操作
投稿者---かずま(2003/06/30 01:54:05)

別解です。
#include <stdio.h>
#include <string.h>

void edit(const char *data, char *result)
{
    int n = strcspn(data, "/:");
    sprintf(result, "%.4s %3.*s%s", data, (n>7) ? 3 : n-4, data+4, data+n);
}