2017-02-28 27 views
-2
char string[200]="ret=\"y\" err=\"000\""; 
    char stringg[50]; 
    char *arg; 
    arg = strstr (string, "ret"); 
    memcpy(stringg,arg+5,1); 
    printf(stringg); 

上記のプログラムは出力を与えますが、retの値が変わるとプログラムを変更する必要があります。この問題を解決するには値を二重反転コンマの中に格納する方法

+0

strchr()はstrtok()? –

+0

'printf("%c "、stringg [0]);'を使用します。問題であると想定されるのは? – Lundin

+0

提案として:「その1つの価値を得る方法」に焦点を当てる代わりに、これを有用なデータ構造にどのように解析できるかを考えることができます。 –

答えて

0

コードでは、配列stringに制限を与える必要はありません。 strstr()"ret"の値を見つけた後

const char string[] = "ret=\"y\" err=\"000\""; 

、およびNULLが返されていなかった、あなたは別の配列やポインタにすべての内容をコピーすることができることを確認し、最初のスペースがあるときにコピーを停止する:あなたは、単に使用することができます見つかりました。これにより、ret = "y"が確実にコピーされます。スペースが見つかると、\0ターミネータで配列またはポインタを終了します。

strchr(3)を使用して'='文字の位置を検索し、存在する場合はその値を別の変数に割り当てることができます。この変数には、等号の後の値が入ります。ここ

は一例であり:

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

int main(void) { 
    const char string[] = "ret=\"y\" err=\"000\""; 
    const char *key = "ret"; 
    const char equals = '=', space = ' ', quote = '"'; 
    char *start, *copy, *next, *value; 
    size_t i; 

    start = strstr(string, key); 
    if (start != NULL) { 
     copy = strdup(start); 
     if (copy == NULL) { 
      fprintf(stderr, "Failed to copy contents of string\n"); 
      exit(EXIT_FAILURE); 
     } 
     for (i = 0; start[i] != space && start[i] != '\0'; i++) { 
      copy[i] = start[i]; 
     } 
     copy[i] = '\0'; 

     next = strchr(copy, equals); 
     if (next != NULL) { 
      next++; 
      if (*next == quote) { 
       next++; 
       next[strlen(next)-1] = '\0'; 
       value = next; 
      } 
     } 

     printf("%s = %s\n", key, value); 

     free(copy); 
    } 

    return 0; 
} 
関連する問題