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

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

 詳しくはこちら


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

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


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

No.22193

strtok
投稿者---neko(2005/07/27 14:04:00)


すみません。
strtokをfor文で回して表示する部分ですが、
(サイト上のサンプルの変更修正)
最後の文字が表示された直後に
落ちます。どのように変更したらよろしいでしょうか?
お手数ですが、よろしくお願いします。

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

#define MONDAISU 10


int main(void)
{
    FILE    *fin,*fout;
    char infile[40],outfile[40],s[256],add[256];
    char tokenCopy[MONDAISU][256];
    char *token = ", ";
    int i;
    int mondaiNo = 0;
    int len = 0;
    int end = 2;

    while (1) {

        /* 入力ファイルオープン */
        if( (fin=fopen("b.txt","a+"))==NULL) {      
        printf("入力ファイルがオープンできません\n");
        exit(1);
        }

        /* 終了条件 */
        do {
            printf("終了?(1:yes 2:no)\n");
            scanf("%d", &end);
            printf("end = %d\n", end);
        } while (end !=1 && end !=2);
        if (end == 1) {
            break;
        }
        
        /* ファイルを1行ずつ読み出す */
        while(fgets(s,256,fin)!=NULL) { 
       printf("s = %s\n", s);  
             /* ","で区切る */   
            strcpy(tokenCopy[0], strtok(s, token));                /* 1度目の呼び出し */
            printf("%s\t", tokenCopy[0]);
            for (i = 1;  i < MONDAISU; i++) {                          /* 2度目以降の呼び出しは */
                strcpy(tokenCopy[i], strtok(NULL, token));         /* 最初の引数にNULLを指定 */
                printf("%s\t", tokenCopy[i]);
                  ↑
            最後の文字表示直後ここで落ちる

            }
            /* 回答の入力 */
            mondaiNo = i;
            printf("%s", s);
            printf("\n問題NO%dの回答番号を入力してください。\n", i);
            scanf("%s", add);
            strcat("問", itoa(mondaiNo, add, 10));
            strcat("=", add);
            strcat( add, ",");
            fprintf(fin ,"%s" , add);
        }
        /* 入力ファイルクローズ */
        fclose(fin);                        
    }

    return 0;
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:strtok 22194 REE 2005/07/27 14:36:35
<子記事> Re:strtok 22197 まきじ 2005/07/27 17:53:32


No.22194

Re:strtok
投稿者---REE(2005/07/27 14:36:35)


>strcat("問", itoa(mondaiNo, add, 10));
>strcat("=", add);

問題ありなコードです。
ここで落ちているかもしれません。
連結した結果はどこに行くのでしょう?



この投稿にコメントする

削除パスワード

No.22195

Re:strtok
投稿者---neko(2005/07/27 15:24:11)


ありがとうございます。

>>strcat("問", itoa(mondaiNo, add, 10));
>>strcat("=", add);
>
>問題ありなコードです。
>ここで落ちているかもしれません。
>連結した結果はどこに行くのでしょう?

確かに文字列が連結されて書きこまれていません。
どのようにすれば連結された文字列で書きこまれるのでしょうか?

strcatなしの下記のソースでもstrtokで最後の文字が表示された直後に
落ちます。


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

#define MONDAISU 10


void main ( void )
{   

    FILE *fin;
//  char s[] = "1,2,2,1,2,1,3,2,1,2";
    char s[30];
    char tokenCopy[MONDAISU][256];
    char *token = ",";          /* 区切り文字はスペースとカンマ */
    int i;


    /* 入力ファイルオープン */
    if( (fin=fopen("b.txt","a+"))==NULL) {      
    printf("入力ファイルがオープンできません\n");
    exit(1);
    }
    /* ファイルを1行ずつ読み出す */
    //ファイルを1行ずつ読み出すとfor文で最後の文字が表示されたところで落ちます。
    
    while(fgets(s,256,fin)!=NULL) { 
        printf("s = %s", s);
    }
    printf("オリジナル:\t");
    printf("%s\n\n", s);       /* トークンを取り出す文字列を表示 */

    printf("取り出したトークン:\n");
                                              
    strcpy(tokenCopy[0], strtok(s, token));   

    printf("%s\t", tokenCopy[0]);

    for (i = 1;  i < MONDAISU; i++) {                
        strcpy(tokenCopy[i], strtok(NULL, token));    
        printf("%s\t", tokenCopy[i]);
        
    }
}




ソース内に下記のようにchar s の値を書きこむと
(ファイル入出力なしの場合落ちない)
落ちないのですが、何が原因なのでしょうか?
お手数ですが、よろしくお願いします。

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

#define MONDAISU 10


void main ( void )
{   

    FILE *fin;
    char s[] = "答え,2,2,1,2,1,3,2,1,2";
    char tokenCopy[MONDAISU][256];
    char *token = ",";          /* 区切り文字はスペースとカンマ */
    int i;

    printf("オリジナル:\t");
    printf("%s\n\n", s);       /* トークンを取り出す文字列を表示 */

    printf("取り出したトークン:\n");
                                              
    strcpy(tokenCopy[0], strtok(s, token));   

    printf("%s\t", tokenCopy[0]);

    for (i = 1;  i < MONDAISU; i++) {                
        strcpy(tokenCopy[i], strtok(NULL, token));    
        printf("%s\t", tokenCopy[i]);
        
    }
}





この投稿にコメントする

削除パスワード

No.22200

Re:strtok
投稿者---まきじ(2005/07/27 18:05:32)


>strcatなしの下記のソースでもstrtokで最後の文字が表示された直後に
>落ちます。

「落ちる」とはどういうことでしょうか?
「不正な処理で終了」とかでましたか?


この投稿にコメントする

削除パスワード

No.22229

Re:strtok
投稿者---neko(2005/07/28 10:34:30)


ありがとうございます。

>>strcatなしの下記のソースでもstrtokで最後の文字が表示された直後に
>>落ちます。
>
>「落ちる」とはどういうことでしょうか?
>「不正な処理で終了」とかでましたか?

そうです。
「不正な処理で終了」とでました。


この投稿にコメントする

削除パスワード

No.22230

Re:strtok
投稿者---おでん(2005/07/28 11:29:09)


>strcatなしの下記のソースでもstrtokで最後の文字が表示された直後に
>落ちます。
>
>
#include <stdio.h>
#include <string.h>

#define MONDAISU 10


void main ( void )
{   

    FILE *fin;
//  char s[] = "1,2,2,1,2,1,3,2,1,2";
    char s[30];
    char tokenCopy[MONDAISU][256];
    char *token = ",";          /* 区切り文字はスペースとカンマ */
    int i;


    /* 入力ファイルオープン */
    if( (fin=fopen("b.txt","a+"))==NULL) {      
    printf("入力ファイルがオープンできません\n");
    exit(1);
    }
    /* ファイルを1行ずつ読み出す */
    //ファイルを1行ずつ読み出すとfor文で最後の文字が表示されたところで落ちます。
    
    while(fgets(s,256,fin)!=NULL) { ← char s[30];と宣言されているのに256バイト読み込むのはなぜでしょうか?
        printf("s = %s", s);
    }
    printf("オリジナル:\t");
    printf("%s\n\n", s);       /* トークンを取り出す文字列を表示 */

    printf("取り出したトークン:\n");
                                              
    strcpy(tokenCopy[0], strtok(s, token));   

    printf("%s\t", tokenCopy[0]);

    for (i = 1;  i < MONDAISU; i++) {                
        strcpy(tokenCopy[i], strtok(NULL, token)); ←NULLが帰ってきたらどうなります?    
        printf("%s\t", tokenCopy[i]);
        
    }
}






この投稿にコメントする

削除パスワード

No.22197

Re:strtok
投稿者---まきじ(2005/07/27 17:53:32)


>strcat("問", itoa(mondaiNo, add, 10));
>strcat("=", add);

strcat() は、第 1 引数の終端に第 2 引数を追加しますので
"問" や "=" の様な文字列リテラルでは追加できません。


この投稿にコメントする

削除パスワード

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