为了完成我正在处理的程序,我必须能够将一些字符串放入堆栈中供以后使用。例如,假设我有这个字符串:
" 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 :(得分: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);
}
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函数,我认为这就是你要找的东西。