2016-03-26 3 views
0

私が取り組んでいるプログラムを完成させるために、後で使うために文字列をスタックに入れなければなりません。例えば、私はこの文字列を持っていたと言う:Cの文字列から1つの単語を得るには?

「22 15から2 +」

理想的には、私は最初、文字列から22を抽出し、別、一時的な文字列に配置し、次にとしてそれを操作したいですをお願いします。ここで私が使っていると思うコードがありますが、それは非常に複雑です。

void evaluatePostfix(char *exp){ 
    stack *s = initStack(); 
    char *temp_str; 
    char temp; 
    int temp_len, val, a, b, i=0, j; 
    int len = strlen(exp); 

    while(len > 0){      
     temp_str = malloc(sizeof(char)); //holds the string i am extracting 
     j=0;        //first index in temp_str 
     temp = exp[i];     //current value in exp, incremented later on the function 
     temp_len = 1;     //for reallocation purposes 
     while(!isspace(temp)){   //if a white space is hit, the full value is already scanned 
      if(ispunct(temp))   //punctuation will always be by itself 
       break;     //break if it is encountered 
      temp_str = (char*)realloc(temp_str, temp_len+1); //or else reallocate the string to hold the new character 
      temp_str[j] = temp;   //copy the character to the string 
      temp_len++;     //increment for the length of temp_str 
      i++;       //advance one value in exp 
      j++;       //advance one value in temp_str 
      len--;      //the number of characters left to scan is one less 
      temp = exp[i];    //prepare for the next loop 
     }        //and so on, and so on... 
    }         //more actions follow this, but are excluded 
}          

私が言ったように、過度に複雑です。このコードを抽出するための簡単な方法はありますか?私は確かに、私が抽出する必要がある値と文字の間に空白があることに依存することができます。

+0

whileループの後の 'temp_str'はどうなりますか?それはちょうどメモリが流出したか、それを返すことを期待しましたか? – Soren

+1

なぜ 'strtok()'を使用せず、元の部分文字列へのポインタを格納するのでしょうか。 strtokは元の文字列バッファを処理するので、再割り当ては必要ありません – xvan

+1

'malloc(sizeof(char));' o.O –

答えて

1

ライブラリ関数を使用してもいいです場合、strtokこの

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

int main() 
{ 
    char str[80] = "22 15 - 2 +"; 
    const char s[2] = " "; 
    char *token; 

    /* get the first token */ 
    token = strtok(str, s); 

    /* walk through other tokens */ 
    while(token != NULL) 
    { 
     printf(" %s\n", token); 

     token = strtok(NULL, s); 
    } 

    return(0); 
} 

Reference


ためであるstrtok(char *str, const char *delim)の制限は、それはそれとして、同時に複数の文字列では動作しないことです解析されるまでインデックスを格納するための静的ポインタを保持します(したがって、一度に1つの文字列で再生する場合は十分です)。より安全で安全な方法は、パースされたインデックスを保存するために明示的に3番目のポインタを取るstrtok_r(char *str, const char *delim, char **saveptr)を使用することです。

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

int main() 
{ 
    char str[80] = "22 15 - 2 +"; 
    const char s[2] = " "; 
    char *token, *saveptr; 

    /* get the first token */ 
    token = strtok_r(str, s, &saveptr); 

    /* walk through other tokens */ 
    while(token != NULL) 
    { 
     printf(" %s\n", token); 

     token = strtok_r(NULL, s, &saveptr); 
    } 

    return(0); 
} 
+0

これは標準Cで動作しますか? (ライブラリ関数が標準Cを意味していないかどうかは分かりません) –

+1

はい、標準のCライブラリ関数です。 –

+2

** ** strtokを使用しないでください。実際にそのパスを移動する必要がある場合は、代わりにtheadsafe strtok_rを使用してください。 – Soren

0

strotk機能を見てください、私はそれがyou'rが探して何だと思います。

+2

** strtokを使用しないでください - スレッドセーフではなく、最終的にあなたのコードを使用しようとする人を殺すでしょう – Soren

+0

strtokのために最初の回答が受け入れられました。本当に? – Michi

関連する問題