2

ファイルから文字列を読み取ってから、100 に達するまで文字列にゼロを追加しようとして、文字列を印刷していますが、何が問題なのかわかりません。複数のアプローチを試しました、しかし、それらはすべて機能していないようです。

int main(int argc, char *argv[])
{
    if (argc != 2 ){
        fprintf(stderr, "usage: server filename \n");
        exit(1);
    }
    FILE *file = fopen(argv[1], "r");
    if (file==0)
    {
        printf("file couldn't be opened\n");
        exit(1);
    } 
    int i;
    char str1[100];
    //char str2[100];
    //memset(str2,0,sizeof(str2));
     //for(i = 0; i < 100; i++)
         // fprintf(stdout, "str2[%u]: %u\n",i,str2[i]);

    while (fscanf(file, "%s", str1) != EOF) 
    {
        for(i=13 ; i < 100; i++)
            str1[i]=0;


    }

         for(i = 0; i < 100; i++)
         fprintf(stdout, "str1[%u]: %u\n",i,str1[i]);

    return 0;
}

しかし、私はそれを印刷します

str1[0]: 119
str1[1]: 111
str1[2]: 114
str1[3]: 108
str1[4]: 100
str1[5]: 0
str1[6]: 0
str1[7]: 0
up till 99

ファイルに「hello」という文字列がありますが、これを理解していないので、これを試しました

int main(int argc, char *argv[])
{
    if (argc != 2 ){
        fprintf(stderr, "usage: server filename \n");
        exit(1);
    }
    FILE *file = fopen(argv[1], "r");
    if (file==0)
    {
        printf("file couldn't be opened\n");
        exit(1);
    } 
    int i;
    char str1[12];
    char str2[100];
    memset(str2,0,sizeof(str2));
     //for(i = 0; i < 100; i++)
         // fprintf(stdout, "str2[%u]: %u\n",i,str2[i]);

    while (fscanf(file, "%s", str1) != EOF) 
    {

     strcpy(str2,str1);

    }

         for(i = 0; i < 100; i++)
         fprintf(stdout, "str2[%u]: %u\n",i,str2[i]);

    return 0;
}

最初の結果とまったく同じ結果が得られたので、ここで何が起こっているのか、なぜこれらの結果が得られたのかわかりません。ここで私が間違っていることを説明していただければ幸いです。前もって感謝します。

4

5 に答える 5

2

最後のコード スニペットでは、次のことを行うべきではありません。

memset(str2,0,sizeof(str2));

代わりに:

memset(str2,0,sizeof(char) * 100);

sizeof でこのリンクを確認してください: http://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays#sizeof

于 2012-09-27T14:15:42.793 に答える
1

ここには多くの間違ったことがあります。

私にとって最も明白なのは、各文字を として印刷していること%uですunsigned int。各文字をchar、つまりとして出力する必要があり%cます。

第二に、 fablealで指摘されているように、あなたmemset()も間違っています。を使用することは、ポインタであるsizeof(str2)のサイズを意味str2し、32 ビット アーキテクチャでは 32 ビットになります。これは明らかにあなたが望むものではありません。

于 2012-09-27T14:16:55.447 に答える
1

文字が表示されない理由は、printf が整数を出力しているためです。次のように変更し%cます。

fprintf(stdout, "str2[%u]: %c\n",i,str2[i]);
于 2012-09-27T14:17:40.793 に答える
0

これ:

memset(str2,0,sizeof(str2));

これは必要ありません。

while (fscanf(file, "%s", str1) != EOF) 
{
 strcpy(str2,str1);
}

反復ごとに上書きstr2します。str1これは、前の文字列が破棄されることを意味します。そのstrcat()場合、ループの前に str2[0] = '\0';` が必要です。

于 2012-09-27T14:17:43.320 に答える
0

私が正しく理解している場合、あなたの目標は、ファイルからの単一行と、それに加えて0を含む文字配列を持つことです。例えば:

ファイル:

hello

配列結果:

[h][e][l][l][o][0][0][0]...

そのための簡単な方法は、配列を 0 に初期化してから、次の行を読み取ることです。

char str1[100] = {'0'};
fgets(str1, 100, file); 

それらを印刷するには、次の文字列のように印刷できます。

printf("%s\n", str1); 

ただし、すべてを 0 (ヌル ターミネータ) に設定すると、"hello" のみが表示されることに注意してください。あなたがしていたように小数で印刷する場合:

for(i=0; i<100; i++)
  printf("%d ", str1[i]);

ASCII の hello に続いて 0 が表示されます。

104 101 108 108 111 10 0 0 0 0 0 0 0 0 0...
于 2012-09-27T14:26:22.397 に答える