0
/* stringlength
 * input: str, pointer to a string
 * output: integer representing the length of string str, 
 * not counting the terminating character.
 *
 * You may NOT call ANY functions within this function.
 */
int stringlength(char *str)
{
    // count the number of characters in str
  int count=0,k;
  for (k=0; str[k] != '\0';k++)
    count++;
    return count;
}

/* countchars
 * inputs: character c, string str
 * output:  The number of instances of c in the string str
 * You may not call ANY function calls within this function.
 */
int countchars(char c, char *str)
{
    // count the number of times c is found in str
  int k,count=0;
  for (k=0;str[k]=='\0';k++)
    {
      if (str[k] == c)
    count++;
      else;
    }

    return count;
}

/* countlines
 * input: char *filename - string containing the filename
 * output: integer representing the number of lines in the file
 */
int countlines(char *filename)
{
    // count the number of lines in the file called filename
  FILE *f = fopen(filename,"r");
    char ch;
    int lines=0;
  f = fopen(filename,"r");

  do{
    ch = fgetc(f);
    if( ch == '\n')
      lines++;
  }while( ch != EOF );

return lines;
}

プログラムに実装しているこれらの3つの異なる機能についてサポートが必要です。私は初心者なので気楽にやってください。カウントライン機能が一番困っています。なぜこれらの機能が機能しないのか、なぜ機能するのかを誰かが説明できれば幸いです。

4

1 に答える 1

3

には多くの問題がありますcountlines()

  1. ファイルを2回開きますが、最初の値を2番目の値で上書きするため、ファイルFILE *を閉じる方法はありません。これは小さな問題です。

  2. 主な問題は、関数が。ではなく、をfgetc()返すことです。特に、はすべてとは異なる値です。intcharEOFchar

  3. コードは、戻る前にファイルを閉じません。一般に、関数でファイルを開く場合は、ファイルを閉じる必要があります。そうでない場合は、ファイルポインタを呼び出し元のコードに戻して、ファイルを閉じることができるようにする必要があります。

  4. do ... whileループが入力ループに対して正しいことはめったにありませんが(上部のループwhileテストはほとんどの場合、はるかにクリーンで明確です)、少なくともを使用していませんでしfeof()た。

    int countlines(char *filename)
    {
        FILE *fp = fopen(filename,"r");
        int ch;
        int lines = 0;
        if (fp == 0)
            return lines;
    
        while ((ch = fgetc(fp)) != EOF)
        {
            if (ch == '\n')
                lines++;
        }
    
        fclose(fp);
    
        return lines;
    }
    

代わりに使用すると、次charの2つのいずれかが発生します。

  • charタイプが、の場合signed、実際の文字(多くの場合ÿ— y-umlaut、U + 00FF、分音記号付きラテン文字Y)も一致EOFするため、ファイルの終わりに達する前に読み取りを停止できます。
  • charタイプがの場合、unsigned値が一致EOFすることはないため、ループが停止することはありません。

にはstringlength()、2つの変数がcountありk、それらは慎重に同じ値に保たれています。2つのうち1つだけが必要です。


不規則なインデント(示されているコードに固有のものであり、間違いなく避けるべきもの)と、else;まったく何もしない不必要で無意味なものを除けば、コードcountchars() はOK後期追加)...のコードはforループ内の条件が反転しています。str[k] != '\0'もちろん、そうあるべきです。

于 2012-09-30T05:17:11.790 に答える