-1

ファイルを開き、スペースを無視して、特定のシーケンスがファイルに表示される回数をカウントする必要があります。ファイル名とシーケンスは、コマンド ラインを使用して入力します。これが私のアプローチです。ファイルを開き、コンテンツを配列に保存し、その配列からすべてのスペースを削除して、別の配列に保存します。次に、シーケンスを検索して、出現回数をカウントします。これは私のコードです:

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

void main (int argc, char *argv[])
{
char *tempRaw;
char *temp;
int size;
//Input check
if(argc != 3) 
{
fprintf(stderr, "Usage: %s Input Search\n", argv[0]);
exit(1);
}
//Open files
FILE *input = fopen(argv[1],"r");
//Check for file
if(input == NULL) 
{
    fprintf(stderr, "Unable to open file: %s\n", argv[1]);
    exit(1);
}
//Get the file size
fseek (input,0,SEEK_END);
size = ftell(input);
rewind(input);
//Allocate memory for the strings
tempRaw = (char*) malloc(sizeof(char)*size);
temp = (char*) malloc(sizeof(char)*size);

//Copy the file's content to the string
int result =0;
int i;
fread(tempRaw,sizeof(char),size,input);
//Remove the blanks
removeBlanks(temp,tempRaw);
fclose(input);

char *pointer;
//Search for the sequence
pointer = strchr(pointer,argv[2]);
// If the sequence is not found
if (pointer == NULL)
{
    printf("%s appears 0 time",argv[2]);
    return;
}
else if (pointer != NULL)
{
    //Increment result if found
    result ++;
}
while (pointer != NULL)
{
    //Search the next character
    pointer = strchr(pointer+1,argv[2]);
    //Increment result if the sequence is found
    if (pointer != NULL)
    {
        result ++;
    }
    //If the result is not found, pointer turn to NULL the the loop is break 
}

printf(" Sequence : %s\n",temp);
printf("%s appears %d time(s)\n",argv[2],result);
}

void removeBlanks( char *dest, const char *src)
{
//Copy source to destination
strcpy(dest,src);
char *old = dest;
char *new = old;
//Remove all the space from destination
while (*old != '\0') 
{
    // If it's not a space, transfer and increment new.

    if (*old != ' ')
    {
        *new++ = *old;
    }
    // Increment old no matter what.

    old++;
}

// Terminate the new string.

*new = '\0';

}

テストしましたが、ファイルからコンテンツを取得する際に問題が発生しました。うまくいくこともありますが、ほとんどの場合、得られるのは空の文字列だけです。

4

1 に答える 1

1

コードにはいくつかの問題があり、コンパイラはそれらについて警告を発するはずです (コンパイラを無視しないでください)。

最初の関数は、定義するだけでなく宣言する必要があるため、次を追加します。

void removeBlanks( char *dest, const char *src);

メイン前。C99 標準 ( 5.1.2.2.1 Program startup )によると、次のmainような戻り値で宣言する必要があり、適切なステートメントint main(int argc, char *argv[])を追加する必要があります。return

上記で指摘したように、キャスト malloc は必要ありません

上記の問題は、機能しない理由ではありません...間違った変数で間違った方法でstrchr関数を使用しているためです。

pointer = strchr(pointer,argv[2]);

する必要があります

pointer = strchr(temp, *argv[2]);

tempはファイルから読み取ったコンテンツへのポインタであり、2 番目の引数として ではなくstrchrが必要なためです。文字列を検索する場合は、strstrを使用する必要があり、次のようになります。charchar *char *

pointer = strstr(temp, argv[2]);

また、空白を削除しtempRawて新しい文字列をtemp2 番目の文字列に格納するため、短くなり、最後にガベージが発生するため、次のようにメモリを初期化する必要があります。

tempRaw = calloc(1, size);

他のエラーもあるかもしれませんが、これらの変更によりうまくいきました...

于 2013-11-10T08:17:08.437 に答える