【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19526

文字編集
投稿者---風魔(2005/01/26 22:28:00)


【入力ファイルの中身】
 urashima_tarou_1,2
 urashima_tarou_2,3
 urashima_tarou_3,1
 urashima_tarou_4,1

【連結した文字列結果】
 urashima_tarou,2,3,1,1

入力ファイルを読み込んでこれらの文字列を部分的に抽出して連結させようとしているのですが、うまく連結させることができません。
どのようにすればよろしいのか教えていただけませんでしょうか。
お願いします。
(連結した文字列の各数字は入力ファイルの各行の最後に書かれている数字です。)

【ソース】
FILE *fp;
char s[GMAX][MMAX];
char name[1024];
int m,i = 0;
char *fname0=NULL,*t[4];
char fbuf[1024]={0};
int len;
char outputString[30];


printf("入力ファイル名を入力して下さい: ");
gets(fbuf);

if( fbuf[0] == '\0'){ // ファイル名が入力されなかったとき
printf("ファイル名が入力されていません.\n");
exit(1);
}

fname0 = (char*)malloc( sizeof(char)*(strlen(fbuf)+1));
strcpy( fname0, fbuf);

if( ( fp = fopen( fname0, "r")) == NULL){
printf("入力ファイル(%s)をオープンできませんでした.\n", fname0);
exit(1);
}


while(fgets(s[i++], MMAX-1, fp) != NULL && i < GMAX);

/* 1行の最後は 0 なので,MMAX-1 とする */

m = i - 1; /* ← 全行数 */

fclose(fp); /* ← 必要 */





len = strcspn(s[0], "1");
len=len-1;
strncpy(name,s[0],len);


for(i = 0; i < m; i++){
t[i] = strchr(s[i],',');
}


strcpy(outputString,name);
strcat(outputString,t[0]);
strcat(outputString,t[1]);
strcat(outputString,t[2]);
strcat(outputString,t[3]);

------------------------------------------------------------


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字編集 19528 HALLS 2005/01/26 22:39:39
<子記事> Re:文字編集 19531 nop 2005/01/26 22:57:07


No.19528

Re:文字編集
投稿者---HALLS(2005/01/26 22:39:39)


>どのようにすればよろしいのか教えていただけませんでしょうか。

投稿なさったソースは作成途中のものでしょうか。
ヘッダーファイルのインクルードやmain関数がありません。


この投稿にコメントする

削除パスワード

No.19532

Re:文字編集
投稿者---風魔(2005/01/26 22:57:54)


>投稿なさったソースは作成途中のものでしょうか。
>ヘッダーファイルのインクルードやmain関数がありません。

すみません。ヘッダーとインクルードなどは省きました。
中身だけわかればいいと思ったんですけど、ソースを改めて
書かせていただきます。このソースはBorland C++ Builderのソフト
を使って書いたC言語です。(ヘッダーやインクルード、文法などは
C言語と変わりませんのであしからず)

【ソース】
//-----------------------------------------------------------------
#pragma hdrstop

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define GMAX 5 /* 最大行数 */
#define MMAX 1024 /* 1行中最大文字数 */
//-----------------------------------------------------------------
#pragma argsused
void main(void)
{

FILE *fp;
char s[GMAX][MMAX];
char name[1024];
int m,i = 0;
char *fname0=NULL,*t[4];
char fbuf[1024]={0};
int len;
char outputString[30];


printf("入力ファイル名を入力して下さい: ");
gets(fbuf);

if( fbuf[0] == '\0'){ // ファイル名が入力されなかったとき
printf("ファイル名が入力されていません.\n");
exit(1);
}

fname0 = (char*)malloc( sizeof(char)*(strlen(fbuf)+1));
strcpy( fname0, fbuf);

if( ( fp = fopen( fname0, "r")) == NULL){
printf("入力ファイル(%s)をオープンできませんでした.\n", fname0);
exit(1);
}


while(fgets(s[i++], MMAX-1, fp) != NULL && i < GMAX);

/* 1行の最後は 0 なので,MMAX-1 とする */

m = i - 1; /* ← 全行数 */

fclose(fp); /* ← 必要 */





len = strcspn(s[0], "1");
len=len-1;
strncpy(name,s[0],len);


for(i = 0; i < m; i++){
t[i] = strchr(s[i],',');
}


strcpy(outputString,name);
strcat(outputString,t[0]);
strcat(outputString,t[1]);
strcat(outputString,t[2]);
strcat(outputString,t[3]);

getchar();
}
------------------------------------------------------------



この投稿にコメントする

削除パスワード

No.19536

Re:文字編集
投稿者---風魔(2005/01/26 23:13:04)


最後に出力文を書いてませんが、先ほど書かせていただいた
ソースの実行結果は


【出力結果】
urashima_tarou・
,2
,3
,1
,1

となります。


この投稿にコメントする

削除パスワード

No.19538

Re:文字編集
投稿者---nop(2005/01/26 23:44:24)


>while(fgets(s[i++], MMAX-1, fp) != NULL && i < GMAX);

とりあえず、行末の改行文字は削除しましょう。

>char name[1024];
>strncpy(name,s[0],len);

これでは、'\0'ターミネートされない。

char name[1024] = {'\0'};

等として、'\0'で初期化するか、
strncpy()後に'\0'を付加すべきです。


この投稿にコメントする

削除パスワード

No.19579

Re:文字編集
投稿者---風魔(2005/01/27 15:55:32)


ありがとうございました。
無事解決いたしました。

また別の質問なんですけれども
【入力ファイル】
urashima_tarou_1,5
   urashima_tarou_2,2
urashima_tarou_3,1
urashima_tarou_4,3

となっていて、2行目がTabキーでスペースが作られていた場合、
先ほどのやり方で入力ファイルを読み込んだときにTabキーのスペース
を削除するにはどうすればよろしいのでしょうか。


この投稿にコメントする

削除パスワード

No.19580

Re:文字編集
投稿者---nop(2005/01/27 15:58:58)


>となっていて、2行目がTabキーでスペースが作られていた場合、
>先ほどのやり方で入力ファイルを読み込んだときにTabキーのスペース
>を削除するにはどうすればよろしいのでしょうか。

読み込んだ後に詰めれば良いんでないの?


この投稿にコメントする

削除パスワード

No.19586

Re:文字編集
投稿者---風魔(2005/01/27 16:17:07)


>読み込んだ後に詰めれば良いんでないの?

#define SPE=' '




while(s[i]==SPE){
s[i]=s[i]+1;
}
とすればいいのでしょうか?


この投稿にコメントする

削除パスワード

No.19588

Re:文字編集
投稿者---風魔(2005/01/27 16:55:19)


Tabキーで作ったスペースの認識ができません。
for(i = 0; i < m; i++){
 for(k = 0; k < MMAX; k++){
if(s[i][k]==' '){



}
}
}

と書いたときにTabキーによるスペースでコンパイルエラーがでてしまいます。エラー内容は「文字列定数が長すぎるか長さが0」と書かれています。かといって普通の半角スペースでif文を作るとif文の中に入ってくれません。スペースがあったならif文の中に通すにはどのようにすればいのでしょうか。


この投稿にコメントする

削除パスワード

No.19589

Re:文字編集
投稿者---REE(2005/01/27 16:58:12)


>Tabキーで作ったスペースの認識ができません。

'\t' でTab文字を表します。


この投稿にコメントする

削除パスワード

No.19590

Re:文字編集
投稿者---風魔(2005/01/27 17:18:08)


>'\t' でTab文字を表します。

無事Tab文字は解決できました。ありがとうございます。
度々申し訳ないのですが、全角スペースというのも\を使ってあらわすことはできるのでしょうか。




この投稿にコメントする

削除パスワード

No.19592

Re:文字編集
投稿者---nop(2005/01/27 17:41:14)


>度々申し訳ないのですが、全角スペースというのも\を使ってあらわすことはできるのでしょうか。

まず、文字と文字列について勉強した方がよいでしょう。
それから、文字コードについても勉強した方がよいでしょう。


この投稿にコメントする

削除パスワード

No.19531

Re:文字編集
投稿者---nop(2005/01/26 22:57:07)


>【入力ファイルの中身】
> urashima_tarou_1,2
> urashima_tarou_2,3
> urashima_tarou_3,1
> urashima_tarou_4,1
>
>【連結した文字列結果】
> urashima_tarou,2,3,1,1

これは、どう言う規則でこの様な結果になるのでしょうか?
日本語で規則を説明してみて下さい。

また、入力が以下の様な場合、
どの様な出力になりますか?

[例1]
urashima_tarou_4,2
urashima_tarou_3,3
urashima_tarou_2,1
urashima_tarou_1,1

[例2]
urashima_tarou_1,2
urashima_tarou_1,3
urashima_tarou_1,1
urashima_tarou_1,1

[例3]
urashima_tarou_1,2
urashima_tarou_2,3
kin_tarou_1,1
kin_tarou_2,5
momo_tarou,2



この投稿にコメントする

削除パスワード

No.19535

Re:文字編集
投稿者---風魔(2005/01/26 23:06:57)


>[例1]
>urashima_tarou_4,2
>urashima_tarou_3,3
>urashima_tarou_2,1
>urashima_tarou_1,1
>
>[例2]
>urashima_tarou_1,2
>urashima_tarou_1,3
>urashima_tarou_1,1
>urashima_tarou_1,1
>
>[例3]
>urashima_tarou_1,2
>urashima_tarou_2,3
>kin_tarou_1,1
>kin_tarou_2,5
>momo_tarou,2

結果は
【例1の場合】
 urashima_tarou,2,3,1,1

【例2の場合】
 urashima_tarou,2,3,1,1

【例3の場合】
 残念ながらできません。

今、質問させていただいている文字の連結についてなのですが
入力ファイルの中身の形式は[名前_苗字_数字1,数字2]となっていて各行の名前と苗字はそれぞれ同じです。
出力の形式は[名前_苗字,1行目の数字2,2行目の数字2,3行目の数字2,4行目の数字2]となっています。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧