2016-05-30 13 views
-1

だから問題があります。Cの文字列の特定の内容を比較する

ユーザ入力:insert( "someWord")
そして、私は最初に、正しく挿入されていることを確認したいと思います。 。私は今のところ、私は完全なユーザー入力されたパラメータを持つ関数を持っている「」内部に含まれる文字列をコピーすると、その関数の内部で、私は次があります。

method header(char *string){ 
    char insert[]="insert("; 
    if((strncmp(string,insert,6)==0) 
    { 
    //the first part was right up to the " 
    //how do I now get the string contained between " "? 
    } 
    else 
    { //invalid input 
    } 
} 

私は100%正でもない場合、strncmpメソッドは2つの文字列の最初の6文字を正しく比較しています。

+0

「私もstrncmpはメソッドが正しく二つの文字列の最初の6つの文字を比較している100%正ませんよ。」何故なの?あなたのコードをテストしたり、[strcmp man page](http://linux.die.net/man/3/strncmp)を読んでもその情報は得られませんか?サブ文字列を抽出するには、[標準文字列関数](http://linux.die.net/man/3/string)の残りの部分を調べて、どの文字列が役に立つのか調べてください。例えば、 'strtok'と' ''を区切り文字として使うか、 'strchr'を使って内側の文字列の始まりと終わりを見つけることができます。 – kaylum

+0

また、insert( "'は7文字ではありません。6.ハードコーディングされた数字ではなく 'strlen(insert)'を使うのがよいでしょう。 '' 'の後に' '' – kaylum

答えて

0

strncmpは、正確な文字数を比較したり、最初のnullが見つかると終了したりします。

ので、

strncmp("inser","insert(",6)  // false -- the first string too short 
strncmp("insert","insert(",6) // true, the first 6 char match 
strncmp("insert(","insert(",6) // true, first 6 char match 
strncmp("insertxyz","insert(",6) // true, the first 6 chars match 
strncmp("insert","inse",6)  // false -- the second string too short 
strncmp("append","insert",6)  // false -- they just don't match 

あなたはNULLバイトが含まれている場合)、8(7つの文字実際には "(挿入"、そうstrncmp(,,6)と比較するは「訓練を取らないこと(あなたの問題であるかどうかわからない場合は

strncmpを実際に使用する理由はありません。strcmpを代わりに使用してください(または、sscanf s A3Fによって提案olution)救助に

3

sscanf(3)

char insert[31]; 
int matched = sscanf(string, "insert(\"%[^\"]30s\")", insert); 
if (matched) printf("Got %s\n", insert); 

これは"が含まれていないとinsert("")に囲まれている30文字より大きくない文字列に一致します。

+0

30バイトの文字列の後にscanfがnull終端を追加し、31バイトの記憶域を必要とするので、バッファを1バイト大きくすることができます。 – Soren

+0

@Sorenあなたは正しいです。 。 – a3f

0

strchrstrncpyと単純なポインタ演算もトリックを行うことができます。

method header(char *string){ 
    char insert[]="insert("; 
    if (strncmp (string, insert, 6) == 0) { 
     char text[MAXC] = "", *p = string + 7, *ep = NULL; 
     if ((ep = strchr (p, ')')) && ep - p < MAXC) 
      strncpy (text, p, ep - p); 
     printf ("header text: '%s'\n", text); 
    } 
    else { //invalid input 
    } 
} 

括弧の間に所望のテキスト(テキストが埋め込ま閉じ括弧を含めることはできません)印刷短い例。

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

#define MAXC 128 

void header (char *string); 

int main (void) { 

    char string[] = "insert(headerinfo)"; 

    header (string); 

    return 0; 
} 

void header (char *string) 
{ 
    char insert[] = "insert("; 
    if (strncmp (string, insert, 6) == 0) { 
     char text[MAXC] = "", *p = string + 7, *ep = NULL; 
     if ((ep = strchr (p, ')')) && ep - p < MAXC) 
      strncpy (text, p, ep - p); 
     printf ("header text: '%s'\n", text); 
    } 
    else { //invalid input 
    } 
} 

注:NUL終端バイトは、初期化によって提供されます。 textを同じ範囲内でstrncpyと再使用する場合は、肯定的にをヌル終了して、その後の使用ごとにtextとする必要があります。

使用例/出力

$ ./bin/headertxt 
header text: 'headerinfo'