2016-05-30 5 views
2

strchrで最初のオカレンスを見つけた後、2文字以上を取得しようとしています。最初のケースではCのstrchrの後ろに2つ以上の文字が得られます

foo;bar;2012 -> should output foo;b 
foo;caz;  -> should output foo;c 
foo;   -> should output foo (there are no +2 chars) 
foo   -> null 

、私は私のような何かを行うことができます理解、

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

int main() 
{ 
    char str[] = "foo;bar;2012"; 
    char *pch = NULL; 

    if ((pch=strchr(str,';')) != NULL) { 
    *pch++; 
    *pch++; 
    *pch = '\0'; 
    } 
    puts(str); 
    return 0; 
} 

しかし、私はせずに、文字列内のポインタを進めることができるかどうかをチェックする適切な方法は何でしょう:文字列は次のように見ることができます行く?

+1

あなたは2文字以上、またはそれらの任意の数を処理する必要がある場合は、その長さを取得するためにはstrlen(strの)を使用します。その後、pchと比較するstr + lenで終了ポインタを作成するか、lenと比較するpch-strでインデックスを見つけることができます。次に、減算して、文字列の最後にいくつの文字があるかを調べます。 –

+0

@ザンリンクスありがとう、素晴らしいことを知っています。 –

+0

'* pch ++;'を 'if(* pch)pch ++;'に変更してみてください – Dmitri

答えて

3

*pch++行はコンパイラの警告を生成しているはずです(そうしないと、十分な警告を有効にしてコンパイルしていません)。 - 読んでその値を無視しない

xw31.c:10:5: error: value computed is not used [-Werror=unused-value] 
    *pch++; 

あなたはpch++;を使用する必要があります。私が得るので、私はエラーとして扱わ警告してコンパイルします。

あなたはどこstrstr()ポイントを超えて、あなたにアクセスしているときに、文字列の末尾に達していませんでしたので、使用できることを確認する必要があります

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

int main(void) 
{ 
    char str[] = "foo;bar;2012"; 
    char *pch; 

    if ((pch = strchr(str, ';')) != NULL) 
    { 
     if (pch[1] != '\0' && pch[2] != '\0') 
      pch[3] = '\0'; 
     puts(str); 
    } 
    return 0; 
} 

内部テストが失敗した場合、文字列はすでに十分に短いです。もちろん、pch[0]はセミコロンです。これにより、出力としてfoo;baが生成されます。あなただけのfoo;bをしたい場合は、あなただけの少ない前方の1つの文字をテストする必要があります。

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

int main(void) 
{ 
    char str[] = "foo;bar;2012"; 
    char *pch; 

    if ((pch = strchr(str, ';')) != NULL) 
    { 
     if (pch[1] != '\0') 
      pch[2] = '\0'; 
     puts(str); 
    } 
    return 0; 
} 
+0

ありがとう、私は今理解しています。次の文字 'pch [1]'をチェックするのが安全かどうかはわかりませんでした。 –

+0

(nullで終了する)文字列で始めると、セミコロンの後に少なくとも1バイトは読み込みが安全でなければならないことがわかります。表示されたコードは、それがさらに安全かどうかをチェックします。 nullバイトを別のバイトで上書きすることがあります。 –

関連する問題