2

プログラム内の多くの配列でこの問題が発生しましたが、その理由がわかりません。配列理論について何かが恋しいと思います。

「Someone」は、配列の最後に?^)(&%などのchar文字を追加します。たとえば、「hello」を含む長さ5の配列がある場合、それがいっぱいになると、hello?()が出力されることがあります。 /&%%。10個の要素で、5個しか使用していない場合に発生する可能性があるので、他の5個の要素はランダムな値を取得する可能性がありますが、いっぱいの場合、どこでそれらの奇妙な値を取得しますか?

最後に文字「\0」を手動で追加することで、部分的に解決します。

たとえば、この問題は、別の配列から配列を埋めようとすると発生することがあります(fgetsを使用してテストファイルから行を読み取った後、1つの単語を抽出する必要があります)。

...
for(x=0;fgets(c,500,fileb);x++) { // read old local file        
int l=strlen(c);
    i=0;
    for (k=0;k<(l-34);k++) {
        if(c[k+33]!='\n') {
            userDatabaseLocalPath[k]=c[k+33];
        }
}

ありがとう

4

2 に答える 2

5

Cの文字列は、値0の文字で終了します。これは、文字リテラルと呼ばれることがよくあります'\0'

サイズ5の文字配列はhello、ターミネータが適合しないため、文字列を保持できません。ターミネータを期待する機能は混乱します。

文字列を保持する配列を宣言するには、使用するのに最適な構文は次のとおりです。

char greeting[] = "hello";

このように、コンパイラが自動的に長さを指定するため、長さ(文字数を数える)を指定する必要はありません。また、ターミネータを含める必要はありません。ターミネータは自動的に追加されるため、上記でターミネータがメモリに作成されます。

          +-+-+-+-+-+--+
greeting: |h|e|l|l|o|\0|
          +-+-+-+-+-+--+

「別の長い配列から配列を埋める」のに問題があるとあなたは言います。これは、文字列コピーと最も呼ばれる操作のように聞こえます。文字列はターミネータを含む単なる配列であるため、余分なスペースがあることがわかっていない限り、長い文字列を短い文字列に盲目的にコピーすることはできません。

上記の場合、このコードは未定義の動作を呼び出します。

strcpy(greeting, "hi there!");

配列にコピーされる文字列greetingは、配列にスペースがあるものよりも長いためです。

これは通常、「十分な大きさであることがわかっている」バッファを使用するか、使用されているスペースを手動で追跡するチェックを追加することで回避されます。これを行う関数がありますがstrncpy()、その正確なセマンティクスはかなり奇妙なので、使用することはお勧めしません。

于 2012-05-09T14:22:21.240 に答える
0

配列の境界制限の問題に直面しています。配列のサイズが5の場合、\0安全な6番目の場所である必要はありません。配列にメモリが予約/割り当てられていないためです。しばらくすると、他のアプリケーションがこのメモリにアクセスして書き込みます。\0結果として文字列helloI accessed this spaceが読み取られなくなります。それはあなたが得ているものです。

于 2012-05-09T17:57:53.473 に答える