2017-05-24 15 views
0

2つのchar配列の内容を比較しようとすると問題が発生します。 時々 文字列が配列の実際のサイズよりも小さい場合は、 '\ 0'のシーケンスはありませんが、しばしば予期しない文字があります(xcodeのデバッグに '\ x01'私が使用するループループの配列のメモリセルが他と同じであるかどうかをチェックするには、同じではありませんでした)。だからこの問題を克服するために、私はユーザに配列の大きさ(-1)と同じように配列の内容を書き込ませることにしました。配列[3]では、ユーザは "hi"( ""なし)を書く。だから私は2つの文字列を比較する方法があるのだろうか(私は長さだが内容について話しているわけではない)、単純なサイクルで2つの配列の中のコードの内容を比較するためには、これは私がわからないコードC言語の2つのchar配列の内容を比較

}while(sent !=1); 


for(contatore=0; contatore<MAXNOME; contatore++){ 

    if(UserName[contatore] == persona.username[contatore]){ 

     controlloUsr++; 
    } 

} 


for(contatore=0; contatore<MAXNOME; contatore++){ 

    if(password[contatore] == persona.password[contatore]){ 

        controlloPsw++; 
    } 

} 


if(controlloUsr == MAXNOME && controlloPsw == MAXPSW){ 

    return 1; 

} else { 

    return 0; 
} 
+1

[MCVE]を表示してください。質問には十分な情報がありません。 –

+0

変数の使用方法がどのように定義され、初期化されているかを知る必要があります。 – alk

答えて

0

の一例である答えを 感謝

を(私は\ 0でベクトルを初期化することを考えていましたが、問題があることができるかどうかはわかりません)それはあなたが求めているものですが、\ 0のようにコードにストップシーケンスを与えずにCの文字列をブラウズする方法はありません。そうしないと永遠にブラウズできません(野生のsegfaultが現れるまで)。 )

このようなstrncmp関数を書くことができます。

int my_strncmp(char *str1, char *str2, size_t max, char c) 
{ 
    size_t n = 0; 
    while (n < max) 
    { 
     if ((str1[n] != str2[n]) || (str1[n] == c) || (str2[n] == c)) 
      return 0; 
     n++; 
    } 
    return 1; 
} 

これは、文字cが一致する場合、または文字列が異なる場合は0を返し、文字列が最大charまで同じ場合は1を返します。 2つの条件のうちの1つが満たされていることを確認するか、許可されたメモリ範囲を参照するので、コードがsegfaultにクラッシュしたり、未定義の動作をしたりします。

+0

C文字列は定義上、文字列の一部である '\ 0'文字で終わらなければなりません。 'max'は配列インデックスの型である' size_t'型でなければなりません。また、 'my_strnlen()'は 'size_t'型を返さなければなりません。これは関数のライブラリ 'strlen()'で返される型でもあります。コードは境界外アクセス後にセグメンテーションされる場合もありません。動作は未定義です。 –

+0

なぜこの関数は 'my_strnlen()'と呼ばれていますか?長さは返されませんが、比較関数です。 –

+0

ありがとう!あなたのコメントで更新された答え –

0

strcmp()strncmp()は、この正確な操作のために作られています。

すべての詳細については、これらの2つの機能についてmanページを読むことができます。

関連する問題