getcharによる文字列入力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
にょん

getcharによる文字列入力

#1

投稿記事 by にょん » 2年前

以下のプログラムなのですが、getcharによって1文字ずつ格納されていることと、各文字列ごとにreturnで文字列の長さが返されることも変わっています。
ですが、やってることは分かっているのにループの順番が不明瞭です。
<実行例>
 ./main
Enter words : aaa bbb
i=0, "aaa"=3
i=1, "bbb"=3


<プログラム>

コード:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define WORDLEN 64
#define WORDNUM 200
#define IN 1
#define OUT 0
int readword(char word[WORDLEN]){
  char cc ;
  int i, flag ;
  flag = OUT ;
  i=0;
  while(!feof(stdin)) {
    cc = getchar() ;
    if (isalpha(cc) || isdigit(cc)){ /* you may use "isalnum()" */
      flag = IN ;
      word[i] = cc ;
      i++ ;
      if (i >= WORDLEN)
        return 0 ;
    }
    else if (flag == IN){
      word[i] = '\0' ;
    return i ;
    }
  }
  return EOF ;
}

int main(void){
  char words[WORDNUM][WORDLEN] ;
  int i, j ;
  int lengh ;
  i=0;
  printf("Enter words : ") ;
  while (!feof(stdin)){
    lengh = readword(words[i]) ;
    printf("%d",lengh);
    if (lengh == 0)
      printf("No more space in readword !!!\n") ;
/* Normally, you shold use fprintf(stderr, ....) at caution. */
else if (lengh == EOF)
printf("End of file!!!\n") ;
else {
printf("i=%d, \"%s\"=%d\n", i, words[i], lengh) ;
i++;
}
}
printf("Dump stored words : \n") ;
for (j = 0 ; j < i ; j++)
printf ("%d:%s\n", j, words[j]) ;
printf("\nBye....\n") ;
return 0 ;
}

アバター
usao
記事: 1887
登録日時: 11年前

Re: getcharによる文字列入力

#2

投稿記事 by usao » 2年前

> …ことも変わっています。

「変わっている」と言われても,元の(変わる前の)状態は誰も知らないので,何の話をしているのか謎.
(「わかっている」の誤記かな?)

> ですが、やってることは分かっているのにループの順番が不明瞭です。

「不明瞭」とは何か?
「どういう順序で動いているのかを(あなたが)読み解けない」という話なのであれば,各所に好きなだけてきとーなprintfでも仕込んでみれば動作順序の把握の助けになるのではあるまいか.

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: getcharによる文字列入力

#3

投稿記事 by あたっしゅ » 2年前

東上☆海美☆「
test.txt

コード:

aaa bb c
を作って、コンソールから

コード:

./main < test.txt
と、やった時、

コード:

Enter words : 3i=0, "aaa"=3
2i=1, "bb"=2
1i=2, "c"=1
Dump stored words :
0:aaa
1:bb
2:c

Bye....
となるけど、『普通にコンソール入力すると、"Dump stored words :"が出ない』ということが言いたいみみ ?
 生のコンソール入力 stdin だと、Ctrl+C 入れると、プログラムが中断しちゃうから。
 それなら try { } catch(...) { } で囲んでやればいいみみ ?

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21350&sid=4cfa1a6250116c5fc5248ca78e64f35b
// getcharによる文字列入力 - ミクプラ(ja)
//
// ConsoleApplication1.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define WORDLEN 64
#define WORDNUM 200
#define IN 1
#define OUT 0
int
readword(char word[WORDLEN]) {
    char cc;
    int i, flag;

    flag = OUT;
    i = 0;
    while (!feof(stdin)) {
        cc = getchar();
        if (isalpha(cc) || isdigit(cc)) { /* you may use "isalnum()" */
            flag = IN;
            word[i] = cc;
            i++;
            if (i >= WORDLEN) { // 間違いではないが、わかりやすいように { を追加した。
                return 0;
            } // 間違いではないが、わかりやすいように } を追加した。
        }
        else if (flag == IN) {
            word[i] = '\0';
            return i;
        }
    }
    return EOF;
}


int
main(void) {
    char words[WORDNUM][WORDLEN];
    int i, j;
    int lengh;

    i = 0;
    try { // 追加
        printf("Enter words : ");
        while (!feof(stdin)) {
            lengh = readword(words[i]);
            printf("%d", lengh);
            if (lengh == 0) { // 間違いではないが、わかりやすいように { を追加した。
                printf("No more space in readword !!!\n");
                /* Normally, you shold use fprintf(stderr, ....) at caution. */
            } // 間違いではないが、わかりやすいように } を追加した。
            else if (lengh == EOF) { // 間違いではないが、わかりやすいように { を追加した。
                printf("End of file!!!\n");
            } // 間違いではないが、わかりやすいように } を追加した。
            else {
                printf("i=%d, \"%s\"=%d\n", i, words[i], lengh);
                i++;
            }
        }
    } // 追加
    catch(...) { // 追加
        // void  // 追加
    } // 追加
    printf("Dump stored words : \n");
    for (j = 0; j < i; j++) { // 間違いではないが、わかりやすいように } を追加した。
        printf("%d:%s\n", j, words[j]);
    } // 間違いではないが、わかりやすいように } を追加した。
    printf("\nBye....\n");
    return 0;
}


// end.
.cpp モードじゃないと、だめみみ ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
usao
記事: 1887
登録日時: 11年前

Re: getcharによる文字列入力

#4

投稿記事 by usao » 2年前

> 生のコンソール入力 stdin だと、Ctrl+C 入れると、プログラムが中断しちゃうから。

入力を終える手段としては,この場合だと
Ctrl+Z や Ctrl+D あたり(実行環境次第らしいけど)を使うのでは.

返信

“C言語何でも質問掲示板” へ戻る