0
#include <stdio.h>
#include <ctype.h>

void readFile(FILE *file);
void count (FILE *file, int *alpha, int *digit, int *punct, int *spaces);
void printMessage(int *alpha, int *digit, int *punct, int *spaces);

int main( void ) {
FILE *file = NULL;
readFile(file);
return 0;
}

void readFile(FILE *file) {
file = fopen("/Users/AdmiralDanny/Desktop/testFile.txt", "r");
int *alpha = NULL, *digit = NULL, *punct = NULL, *space = NULL;
if (file) {
  count(file, alpha, digit, punct, space);
  fclose(file);
} else {
  perror( "error opening the file" );
}
}

void count (FILE *file, int *alpha, int *digit, int *punct, int *spaces) {
  int ch;

 while ((ch = fgetc(file)) != EOF ) {
   if (isalpha(ch) != 0) {
  ++alpha;
  } else if (isdigit(ch)) {
  ++digit;
  } else if (ispunct(ch)) {
  ++punct;
  } else if (isspace(ch)) {
    ++spaces;
  }
}
 printMessage(alpha, digit, punct, spaces);
}

void printMessage(int *alpha, int *digit, int *punct, int *spaces) {
printf( "alphabetic characters: %d\n", alpha );
printf( "digit characters: %d\n", digit);
printf( "punctuation characters: %d\n", punct );
printf( "whitespace characters: %d\n", spaces );
}

私の .txt ファイルには 4 つのスペースと 12 個のアルファベット文字しかありませんが、48 個のアルファベット文字と 8 個の空白文字が得られますか? なぜこうなった?また、printMessage メソッドで int ポインターを出力しようとすると警告が表示されます

4

2 に答える 2

3

どのints にもメモリが割り当てられておらず、関数は値ではなくポインタcount()をインクリメントしているだけです。intint

++spaces; /* spaces is an int* so this increments the pointer. */

を使用することもできますmalloc()が、スタック割り当てしてアドレスを渡す方が簡単です。

int alpha = 0, digit = 0, punct = 0, space = 0;
count(file, &alpha, &digit, &punct, &space);

とでcount()

(*spaces)++;

インクリメント用に s を逆参照intし、印刷用に逆参照します。

printf( "whitespace characters: %d\n", *spaces);

の呼び出し元はs のcount()更新された値を必要としないためint、単に値を渡し、ポインターを完全に忘れてください ( についても同じですprintMessage())。

于 2012-08-04T06:39:58.513 に答える
0

ポインターが指すアドレスを出力できます。

printf( "alphabetic characters: %p \n", alpha );

値だけが必要な場合:

printf( "alphabetic characters: %d\n", *alpha );

*digit、*punct .... と同じ

于 2012-08-04T06:40:42.757 に答える