C言語関係掲示板

過去ログ

No.1098 標準入力から複数の文字列を読み込む

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

標準入力から複数の文字列を読み込む
投稿者---prontera(2004/06/04 16:53:11)


文字列入力について困っています。
多分木を使った文字列操作のプログラムを作成しているのですが、

/靴燭縫痢璽匹鮑鄒 --> $ mkdir ノード名
⊃靴燭吠源列レコードを作成 --> $ mkstr レコード名 格納する文字列名

というようにコマンド+引数の形式で目的の関数を呼び出すような仕様です。
,両豺腓蓮mkdir ノード名 リターン
△両豺腓蓮mkstr レコード名 格納する文字列名 リターン
として次の処理に行きたいのですがうまくいきません。何かいい方法はないでしょうか?




No.14464

Re:標準入力から複数の文字列を読み込む
投稿者---あかま(2004/06/04 20:10:01)


こんな感じになるのだろうか。

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


int get_command(char com[][32]){
    char str[256];
    char *p;
    int i;
    
    fgets(str,256,stdin);
    if((p = strchr(str,'\n')) != NULL) *p = '\0';//改行削除
    
    p = strtok(str," ");//トークン切り分け
    for(i=0; p != NULL ;i++) {
        strcpy(com[i],p);
        p = strtok(NULL," ");
    }
    
    return i;

}

int main(){
    
    char com[10][32];
    int i,j;
    i = get_command(com);
    
    for(j = 0;j < i;j++){
        printf("%s\n",com[j]);
    }
    
    if(strcmp("mkdir",com[0])==0){
        mkdir(com[1]);
    }
    else if(strcmp("mkstr",com[0])==0){
        mkstr(com[1],com[2]);
    }
    return 0;
}



No.14474

Re:標準入力から複数の文字列を読み込む
投稿者---pipi(2004/06/05 03:34:56)


><pre>
こんな感じになるのだろうか。

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


int get_command(char com[][32]){
char str[256];
char *p;
int i;

fgets(str,256,stdin);
if((p = strchr(str,'\n')) != NULL) *p = '\0';//改行削除

p = strtok(str," ");//トークン切り分け
for(i=0; p != NULL ;i++) {
strcpy(com[i],p);
p = strtok(NULL," ");
}

return i;

}

int main(){

char com[10][32];
int i,j;
i = get_command(com);

for(j = 0;j < i;j++){
printf("%s\n",com[j]);
}

if(strcmp("mkdir",com[0])==0){
mkdir(com[1]);
}
else if(strcmp("mkstr",com[0])==0){
mkstr(com[1],com[2]);
}
return 0;
}
上記のところの二次元配列で宣言して渡していますが、一次元でやってみたのですが、うまくいきません。なぜ二次元配列でわたすとうまくいくのが教えていただけないでしょうか。


No.14475

Re:標準入力から複数の文字列を読み込む
投稿者---あかま(2004/06/05 04:13:49)


>上記のところの二次元配列で宣言して渡していますが、一次元でやってみたのですが、うまくいきません。なぜ二次元配列でわたすとうまくいくのが教えていただけないでしょうか。
スペース区切りで文字列を分けるわけだから、1つの文字列が2つにも3つにも分かれます。
複数の文字列を格納するには2次元配列が便利でしょう。


No.14476

Re:標準入力から複数の文字列を読み込む
投稿者---pipi(2004/06/05 09:57:34)


>>上記のところの二次元配列で宣言して渡していますが、一次元でやってみたのですが、うまくいきません。なぜ二次元配列でわたすとうまくいくのが教えていただけないでしょうか。
>スペース区切りで文字列を分けるわけだから、1つの文字列が2つにも3つにも分かれます。
>複数の文字列を格納するには2次元配列が便利でしょう。

やっとわかりました。配列ではなくてmain関数のように文字列れのポインタで表現することにしました。本当にありがとうございました。



No.14465

Re:標準入力から複数の文字列を読み込む
投稿者---かずま(2004/06/04 20:44:13)


#include <stdio.h>

void mkstr(const char *d, const char *s) { printf(" mkstr %s %s\n", d, s); }

void mkdir(const char *d) { printf(" mkdir %s\n", d); }

int main(void)
{
    char buf[256], name[256], str[256], c;

    while (fgets(buf, sizeof buf, stdin))
        if (sscanf(buf, " mkstr %s %s %c", name, str, &c) == 2)
            mkstr(name, str);
        else if (sscanf(buf, " mkdir %s %c", name, &c) == 1)
            mkdir(name);
        else
            puts(" ???");
    return 0;
}



No.14473

Re:標準入力から複数の文字列を読み込む
投稿者---prontera(2004/06/05 01:53:32)


なるほど〜。sscanfの戻り値やトークン切り分けを駆使すればできそうですね。
あかまさん、かずまさん、ヒントありがとうございます。