0

read()ファイルを単語ごとに読み取るCプログラムを作成する必要があります(メソッドを使用する必要があります。Cライブラリやその他のメソッドの使用は許可されていません)。ファイルの単語と指定された単語を比較したいと思います。基本的には、特定の単語をファイルで検索しています。

私の問題は、ファイルから単語を取得するときです。「bla」と同じ文字列と比較すると、strcmp()それらが同一であることはわかりません。

以下にコードを貼り付けました。

#include <stdlib.h>
#include <fcntl.h> //open,creat
#include <sys/types.h> //open
#include <sys/stat.h>
#include <errno.h> //perror, errno
#include <string.h>

int tananyag; 
int fogalom; 
int modositott;
char string_end = '\0';

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

    tananyag = open("tananyag.txt",O_RDONLY); 
    fogalom = open("fogalom.txt",O_RDONLY); 
    modositott =open("modositott.txt",O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR);

    if (tananyag < 0 || fogalom < 0 || modositott < 0){ perror("Error at opening the file\n");exit(1);}

    char c;
    int first = 1;
    char * str;
    str = (char*)malloc(80*sizeof(char));

    while (read(tananyag,&c,sizeof(c))){ 

            if(c != ' '){

            if(first){
                strcpy(str,&c);
                first = 0;
            }
            else{
                strcat(str,&c);
            }           
        }
        else
        {
            strcat(str,&string_end);

            printf("%s string length: %i \n",str,strlen(str));
            printf("%s string compared to bla string: %i \n",str, strcmp(str,"bla"));
            str = (char*)malloc(80*sizeof(char));
            first = 1;
        }
    }
    close(tananyag);
    close(fogalom);
    close(modositott);
}
4

1 に答える 1

0

は単一の文字であり、null で終わる文字シーケンスが必要なため、strcpyと一緒に使用することはできません。このコードも機能することに驚いています。文字列に書き込むには、独自の方法を使用する必要があります。たとえば、次の書き込み位置を格納するインデックスを保持できます。ccstrcpyi

あなたから派生したサンプルコード:

int i = 0;
while (read(tananyag,&c,sizeof(c))){ 
    if (c != ' ') {
        if (i < 79) {
            str[i] = c;
            i++;
        }
    }
    else
    {
        str[i] = '\0';
        printf("%s string length: %zu\n",str,strlen(str));
        printf("%s string compared to bla string: %d \n",str, strcmp(str,"bla"));
        i = 0;
    }
}

バッファ オーバーフローを回避するための重要なチェックを追加しました。バッファのサイズを超えて書き込むことはできません。このコードでは、巨大な単語の余分な文字は無視されます。

注:グッド プラクティス ルールが要求するように80、定義済みの定数にする必要があります。

于 2013-10-23T20:40:36.447 に答える