C中的空字符串
我写了一个函数来表示一个数学表达式。它似乎工作得很好,除了一件事:第一个令牌的开头有一个垃圾值。我首先将变量currentToken声明为“”,然后在处理函数表达式时向其添加新字符。当令牌完成时,我再次为其分配内存,并再次将其设置为“”。除了第一个标记外,整个想法似乎都在起作用 标记化函数和一些相关部分的代码如下:C中的空字符串,c,string,C,String,我写了一个函数来表示一个数学表达式。它似乎工作得很好,除了一件事:第一个令牌的开头有一个垃圾值。我首先将变量currentToken声明为“”,然后在处理函数表达式时向其添加新字符。当令牌完成时,我再次为其分配内存,并再次将其设置为“”。除了第一个标记外,整个想法似乎都在起作用 标记化函数和一些相关部分的代码如下: /* Returns a list of strings (tokens) that make up the infixString: */ ListOfStrings tokeni
/* Returns a list of strings (tokens) that make up the infixString: */
ListOfStrings tokenize_infix_str( const char *const infixString )
{
ListOfStrings tokens;
char *currentToken = "";
char currentChar;
int i;
int lengthOfInfixString = strlen( infixString );
initialize_list_of_strings( &tokens );
for ( i = 0 ; i < lengthOfInfixString ; ++i )
{
currentChar = *( infixString + i );
if ( ( currentChar != ' ' ) && ( currentChar != '\t' ) && ( currentChar != '\n' ) )
{
currentToken = append_ch_to_str( currentChar, currentToken );
if ( i <= lengthOfInfixString - 2 )
{
if ( ( global_array_contains_token( "allFunctions", currentToken ) ) ||
( global_array_contains_token( "allOperators", currentToken ) ) ||
( ( ( strcmp( currentToken, "(" ) ) == 0 ) ||
( ( strcmp( currentToken, ")" ) ) == 0 ) ||
( ( strcmp( currentToken, "x" ) ) == 0 ) ) ||
( ch_is_part_of_number( currentChar ) &&
!ch_is_part_of_number( *( infixString + i + 1 ) ) ) )
{
insert_at_end_of_list_of_strings( &tokens, currentToken );
currentToken = ( char * )malloc( sizeof( char ) );
currentToken = "";
}
}
else
{
if ( ( global_array_contains_token( "allFunctions", currentToken ) )
|| ( global_array_contains_token( "allOperators", currentToken ) )
|| ( ( ( strcmp( currentToken, "(" ) ) == 0 )
|| ( ( strcmp( currentToken, ")" ) ) == 0 )
|| ( ( strcmp( currentToken, "x" ) ) == 0 ) )
|| ( ch_is_part_of_number( currentChar ) ) )
{
insert_at_end_of_list_of_strings( &tokens, currentToken );
}
}
}
}
free( currentToken );
currentToken = NULL;
//DEBUG:
printf( "tokens from infix expression are:\n" );
print_list_of_strings( &tokens );
//ENDDEBUG
return tokens;
}
/* Appends ch to str and returns the resulting string; returns NULL if an error occurs: */
char *append_ch_to_str( const ch, char *str )
{
char *temp;
int i;
int tempLength;
int strLength = strlen( str );
if ( strLength != 0 )
{
temp = ( char * )malloc( ( strLength + 2 ) * sizeof( char ) );
if ( temp == NULL )
{
return temp;
}
for ( i = 0 ; i < strLength ; ++i )
{
*( temp + i ) = *( str + i );
}
/* At this point, i equals strLength. */
*( temp + i++ ) = ch;
*( temp + i ) = '\0';
return temp;
}
else
{
temp = ( char * )malloc( 2 * sizeof( char ) );
*( temp ) = ch;
*( temp + 1 ) = '\0';
return temp;
}
}
/* Returns str1 + str2, or NULL if an error occurs: */
char *append_str2_to_str1( char * str1, const char *str2 )
{
char *newString = ( char * )malloc( ( ( strlen( str1 ) ) + ( strlen( str2 ) ) + 1 ) *
sizeof( char ) );
int i = 0;
if ( newString != NULL )
{
memcpy( newString, str1, strlen( str1 ) );
for ( ; i <= strlen( str2 ) - 1 ; ++i )
{
if ( ( str1 = append_ch_to_str( *( str2 + i ), str1 ) ) == NULL )
{
return NULL;
}
}
if ( ( str1 = append_ch_to_str( '\0', str1 ) ) == NULL )
{
return NULL;
}
return str1;
}
return NULL;
}
typedef struct listOfStrings {
char **array;
int numberOfElements;
} ListOfStrings;
/*返回组成infixString的字符串(令牌)列表:*/
ListOfstring标记化中缀字符串(常量字符*常量中缀字符串)
{
列表标记;
char*currentToken=“”;
字符当前字符;
int i;
int lengthOfInfixString=strlen(infixString);
初始化\u字符串和令牌的\u列表\u;
对于(i=0;i if(你试过调试吗?我没有调试经验。我只是在屏幕上打印令牌。首先,当前令牌应该初始化为NULL,而不是空字符串,空的输入中缀将很快证明这一点,因为你将向free()传递一个只读文本地址
在上述情况下。此外,您的append函数会泄漏内存,因为您永远不会释放旧的缓冲区或使用我建议使用的realloc
。在该代码中隐藏着一个明显的内存泄漏,它为单个字符分配内存,然后通过分配到字符串文本地址来立即覆盖分配结果,例如在以太中丢失分配。调试这个。我明白了。谢谢你的输入。