如何从C中的字符串中获取单个单词?

时间:2016-03-26 20:15:58

标签: c string

为了完成我正在处理的程序,我必须能够将一些字符串放入堆栈中供以后使用。例如,假设我有这个字符串:

" 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
}                                       
像我说的那样,过于复杂。有没有更简单的方法来提取此代码?我可以可靠地依赖于我需要提取的值和字符之间的空白区域。

2 个答案:

答案 0 :(得分: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)的限制是它不能同时处理多个字符串,因为它维护一个静态指针来存储索引,直到它被解析(因此,如果一次只播放一个字符串就足够了) )。更好更安全的方法是使用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);
}

答案 1 :(得分:0)

看一下strotk函数,我认为这就是你要找的东西。