2017-01-31 14 views
-7

私はインタプリタをC++で実行しようとしていますが、ユーザがタイプaを入力すると、 intまたはboolまたはstring。だから私の質問は、最初の5文字がタイプであるかどうかを知りたがっていることです(これは私が欲しいことをするために考えるベストソリューションですが、私の質問はこれを別の方法で!非常に醜い方法あなたの質問に文字列にインデックスから別のインデックスへの文字列が含まれていないか確認する

if (str.at(0) == 't' && str.at(1) == 'y' && str.at(2) == 'p' && str.at(3) == 'e' && str.at(4) == '(') 
+2

http://stackoverflow.com/questions/931827/stdstring-comparison-check-whether-string-begins-with-another-string – drescherjm

答えて

0

直接の答えは、おそらくstd::string::compareまたはstd::string::findを使用している。私は、利点と欠点を持つ例に直接あなたを持っているだろう「C++の文字列で始まる」という用語でGoogle検索を想定

しかし、非常に単純なパーサーを書くときには、cの文字列ライブラリのトークン化ツールstrtokを使用すると簡単になります。strtokその後の分割各トークンはstrtokへの呼び出しによって次のトークンを返します。トークンを区切る文字をstrtokにパラメータとして渡されます。

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

int main() 
{ 

    std::string str = "type(a)"; 

    if (str.compare(0,5,"type(") == 0) { 
     // string starts exactly with `type(`; 
     // note: 'type (' would not match... 
    } 

    char* analyzeStr = strdup(str.c_str()); 
    char *token = strtok(analyzeStr, "("); 
    if (token && strncmp(token, "type", strlen("type")) == 0) { 
     // command starts with "type(" or "type (" 
     token = strtok(NULL, ")"); 
     if (token) { 
      // value between brackets 
      printf("analyzing type of '%s'", token); 
     } 
    } 
    free(analyzeStr); 

    return 0; 
} 
+0

[ドキュメントを読みますon strtok](http://en.cppreference.com/w/c/string/byte/strtok)を参照してください。簡単な時間で簡単な問題を解決するように設計されていることに由来するいくつかの注意点があり、適切でない可能性があります。たとえば、ソース文字列の 'strtok'の破壊的な影響を回避するには' char * analyzeStr = strdup(str.c_str()); 'と' free(analyzeStr);の必要性に注意してください。 – user4581301

関連する問題