2016-04-12 65 views
4

現在この課題を処理中です。目的は、ファイルを読み込み、これらのchar値がファイルのStringに存在するかどうかを調べることです。私はファイルからのStringを、引数として入れた別のStringと比較する必要があります。しかし、各char値がファイルのStringにある限り、それは "一致"します。文字列にすべてのchar値が含まれていることを確認してください。

例(入出力):


が行わ行わ

./a.out file1が行わ間抜け
である

は犬ではない

例(FILE1):

bonehead
doggie

比較できる文字列はわかりますが、文字列は問題ではなく、ファイルは1行につき1語に続きます。 char値が他のStringに存在するかどうかを調べるプログラムをまとめましたが、それは問題の一部に過ぎません。これについてどうやったらいいの?

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

int main(int argc, char **argv){ 
    FILE *f = fopen(argv[1], "r"); 
    char *line = NULL; 
    size_t len = 0; 
    ssize_t read; 
    char *word = argv[2]; 

    if(argc != 3){ 
      printf("./a.out <file> <word>\n"); 
      exit(EXIT_SUCCESS); 
    } 

    if(f == NULL){ 
      printf("file empty\n"); 
      exit(EXIT_SUCCESS); 
    } 

    // confused what this loop does too 
    while((read = getline(&line, &len, f)) != -1){ 
      char *c = line; 
      while(*c){ 
        if(strchr(word, *c)) 
          printf("can't spell \"%s\" without \"%s\"!\n", line, word); 
        else 
          printf("no \"%s\" in \"%s\".\n", word, line); 
      c++; 
      } 
    } 
    fclose(f); 
    exit(EXIT_SUCCESS); 
} 
+0

私はいくつかの意見と応答がないようですが、私の質問はひどく言われていますか?私は必要に応じて書き換えたり説明したりすることができます。 – Joe

+0

割り当ては文字列ではなく文字をチェックすることです。だから、あなたが書いたように(教師は別の指示を与えるかもしれない)、要件に応じて文字の順序は重要ではありません。 – jdweng

+0

ちょっと混乱します。ここでは、ファイルの単語の文字が入力されているかどうかをテストします。 –

答えて

0

別のアプローチを助けるかもしれませんその総和が一意の文字によって構成された文字列の長さが検索用語である場合には、検索用語中の一意の文字のそれぞれがファイルから読み取られた行に含まれる。

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

#define MAXC 256 

int main (int argc, char **argv) { 

    if (argc < 3) { /* validate required arguments */ 
     fprintf (stderr, "error: insufficient input, usage: %s file string\n", 
       argv[0]); 
     return 1; 
    } 

    FILE *fp = fopen (argv[1], "r"); 
    char line[MAXC] = ""; 
    char *s = argv[2]; /* string holding search string */ 
    size_t slen = strlen(s), sum = 0, ulen; 
    char uniq[slen+1]; /* unique characters in s */ 

    if (!fp) { /* validate file open */ 
     fprintf (stderr, "error: file open failed '%s'.\n", argv[1]); 
     return 1; 
    } 

    memset (uniq, 0, slen+1); /* zero the VLA */ 
    /* fill uniq with unique characters from s */ 
    for (; *s; s++) if (!strchr (uniq, *s)) uniq[sum++] = *s; 
    ulen = strlen (uniq); 
    s = argv[2]; /* reset s */ 

    while (fgets (line, MAXC, fp)) { /* for each line in file */ 
     if (strlen (line) - 1 < ulen) { /* short line, continue */ 
      printf ("%s is not in %s", s, line); 
      continue; 
     } 
     char *up = uniq; /* ptr to uniq */ 
     sum = 0;   /* reset sum */ 
     while (*up) if (strchr (line, *up++)) sum++; /* count chars */ 
     if (sum < ulen) /* validate sum */ 
      printf ("%s is not in %s", s, line); 
     else 
      printf ("%s is in %s", s, line); 
    } 
    fclose (fp); /* close file */ 

    return 0; 
} 

使用例/出力検索文字列内の重複文字に対しても同様に動作します

$ ./bin/strallcinc dat/words.txt done 
done is in bonehead 
done is not in doggie 

。例えば

$ ./bin/strallcinc dat/words.txt doneddd 
doneddd is in bonehead 
doneddd is not in doggie 

あなたが異なっ重複文字を扱うかどうあなたが決めることができますが、その不測の事態に対処する方法にいくつかの決意をしなければなりません。

質問がある場合はお知らせください。

0

confused what this loop does
while (read ...ラインは明らかに

* cは変数lineの先頭へのポインタであるライン変数に置く、あなたのファイルからの行を読み込み、このポインタはc++インクリメントされファイルからの単語の各文字がアクセスされるようにします。 * cがヌルターミネータ(0)を指しているとき、whileループは終了します。

if (strchr(word ...行は、テストワードにファイル内の単語からの文字のいずれかが含まれている場合にテストされます。 これはあなたがやろうとしていることとは逆のようです - テストワードのすべての文字がファイルの単語に含まれているかどうかを調べる。

printf行は、/またはどちらもないため意味がありません。文字がある場合は「yes」を、行がない場合は「no」を印刷する行が1行必要です。

printfステートメントは比較ループの外にある必要があります。そのため、各単語に複数の行を出力することはできません。単語に文字がないかどうかを示すフラグを追加します。開始時にフラグを1に設定し、文字が存在しない場合はフラグを0に変更し、フラグを使用して2つの結果ステートメントの1つを印刷します。

このコードスニペットは、単にテストするために供給ワード中の各ユニークなキャラクターのための1つを追加し、ファイルから読み込んだ行にマッチした各文字のsumを維持し、場合でしょう

/* set flag to 'letters all present' */ 
    int flag = 1; 
    /* set pointer c to start of input line */ 
    c = word; 
    /* test word from file for each letter in test word */ 
    while(*c) { 
     if(strchr(line, *c) == NULL) { 
      /* set flag to letter not present */ 
      flag = 0; 
      break; 
     } 
     c++; 
    } 
関連する問題