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

main()
{
    char str[5]={'\0'};
    printf("Initial length before passing = %ld\n",strlen(str));
    input(str);
    printf("Received string = %s\n",str);
    printf("Length after getting input(calling function) = %ld\n",sizeof(str));
}

input(char * buffer)
{
    puts("Enter something: ");
    printf("Initial length after passing = %ld\n",strlen(buffer));

    if ( fgets(buffer, sizeof(buffer), stdin) == NULL )
        return -1;
    else
    {
        printf("Length after getting input(called function)= %ld\n",strlen(buffer));
        return 0;
    }
}

出力 1

Initial length before passing = 0
Enter something: 
Initial length after passing = 0
hello
Length after getting input(called function)= 6
Received string = hello

Length after getting input(calling function) = 5

アウトプット 2

Initial length before passing = 0
Enter something: 
Initial length after passing = 0
helloooooo
Length after getting input(called function)= 7
Received string = hellooo
Length after getting input(calling function) = 5

異なる入力をしたときに異なる長さを出力するのはなぜですか?

  1. 出力 1 & 2 で、5 文字だけにスペースを割り当てたのに、最初の長さが 6 なのはなぜですか?
  2. 出力 1 と出力 2 の両方で、渡す前と渡した後で文字列の長さが異なるのはなぜですか?
  3. 出力 2 で、割り当てたスペースが少ないのに、なぜ「入力 (関数と呼ばれる) を取得した後の長さ = 7」になるのですか?
4

3 に答える 3

2

strlenは、C 文字列、つまり で終わる char 配列を操作することになっていました\0。定義する場合:

char str[5];

strガベージが含まれています。呼び出しstrlenによってセグメンテーション違反が発生しなかったのは幸運です。

于 2013-06-23T02:16:00.853 に答える
1
char str[5];
printf("Initial length before passing = %ld\n",strlen(str));

strlenバッファのサイズではなく、指定された文字列の長さを返します。何にも初期化strしていないので、ゴミだらけです。 strlenそのガベージの「長さ」を返します。これは何でもかまいません。

于 2013-06-23T02:18:01.697 に答える
1

1) 出力 1 & 2 で、5 文字だけにスペースを割り当てたのに、最初の長さが 6 なのはなぜですか?

最初のstrlen(str)呼び出しは、宣言しchar str[5]たが何も入れていないため、実際には定義されていません。だから内容は誰が知っているかです。6が返されたという事実は、0 に遭遇する前strlen(str)のアドレスから始まる 6 つの非ゼロ文字がたまたまメモリ内にあったことを意味します。str

2) 出力 1 と出力 2 の両方で、文字列の長さが通過前と通過後に異なるのはなぜですか?

ランダムなメモリ コンテンツの長さ 6 を取得した後、何かを文字列バッファーにロードし、それをゼロで終了しました。それで、長さがリアルなものに変わりました。

3)出力2で、割り当てたスペースが少ないのに、なぜ「入力(関数と呼ばれる)を取得した後の長さ= 7」になるのですか?

実際には、割り当てられたスペースをより長い文字列 (長さ 7) でオーバーランしたためです。その場合、プログラムがクラッシュしなかったのは幸運でした。

次のように、C でバッファーを宣言する場合:

char str[5];

何かを行うために5バイトのスペースを予約していることをコンパイラに伝えるだけで、そのスペースとそのスペースのみを使用する権利が与えられますstr。バッファーに何かを入れない限り、開始するものが必ずしもバッファーにあるとは限りません。また、宣言した以上に書き込むことを妨げません。

str[5]C の文字列はゼロで終了するため、「hello」を保持するのに十分な大きさではないことに注意してください。したがって、サイズ N の文字列を保持するには、サイズ N+1 の文字バッファーが必要です。C でバッファーをオーバーフローさせると、結果が不安定になり、予測不能になります。

于 2013-06-23T02:23:04.173 に答える