-1

char ポインターへの値の割り当てに問題があります。

#include<stdio.h>

int main(int argc, char* argv[]){
    char line[200], *p, q;
    int i=0;
    FILE* f=fopen(argv[1], "r");
    for( ; ;){
            p=fgets(line, 200, f);
            if (p==NULL) break;
            printf("%s", p);
            i=0;
            while(p[i]!='\n'){
                    if (p[i]=='a') p[i]='A';
                    i++;
            }
            printf("%s", p);

    }
}

私は知っている、その行

p[i]='A';

は機能しませんが、それが基本的に必要なことであり、 achar*を aに置き換えcharます。それを返すのでp、である必要があります。私の質問は、 aを a に変換できるかどうか、または値を に割り当てる方法があるかどうかです。char*fgets()char*char []char*

4

1 に答える 1

4

あなたのコードはそのまま完全に機能します。次のような入力ファイルが与えられた場合、基本的なケースから始めます。

あいうえお

そして、1つの改行(「d」の後の「Enter」キー)プログラムはコンソールに出力します:

abcd
abcd

これはまさにあなたがそれをコーディングした方法です。ファイルを書き込みではなくAbcd読み取り用に開いただけなので、ファイルに書き戻すことはありません。うまくいけば、それはあなたが目指していたものではありません。

注: ファイルに改行がない場合、または最初から 200 文字を超えている場合は、バッファ オーバーランが発生し、機能していないように見える可能性があります。繰り返しますが、私が示したように非常に基本的なファイルから始めて、コードがここに投稿したものとまったく同じであることを確認してください。


> I know, that the linep[i]='A'; 動作しません、

  • 不正解です。配列へのポインターpまたは配列自体lineを使用して、要素にアクセスして変更できます。fgets()最初の 200 文字 (または最初の改行まで) を に格納し、line割り当てたポインタを返しますp。配列内の文字にアクセスまたは変更するために機能します。

> I ... need to ..., replace a char* with a char

  • それはあなたがここでやっていることではありません。を使用しchar *pて配列にアクセスし、char 'a'forを変更しています'A'

> p needs to be a char* because fgets() returns that.

  • 実際fgets()には2つのことを提供します。配列を埋めて「返します」(line)。またchar *、埋められた配列に a を返します。いいえ、まったく使用する必要はありませんp。以下では、同じコードがポインターなしで機能します。


int main(int argc, char* argv[]){
    char line[200];
    int i=0;
    FILE* f=fopen("test.txt", "r");
    for( ; ;){
            if (fgets(line, 200, f)==NULL) break;
            printf("%s", line);
            i=0;
            while(line[i]!='\n'){
                    if (line[i]=='a') line[i]='A';
                    i++;
            }
            printf("%s", line);

    }
    return 0;
}
于 2013-05-20T14:36:29.293 に答える