Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的空字符串_C_String - Fatal编程技术网

C中的空字符串

C中的空字符串,c,string,C,String,我写了一个函数来表示一个数学表达式。它似乎工作得很好,除了一件事:第一个令牌的开头有一个垃圾值。我首先将变量currentToken声明为“”,然后在处理函数表达式时向其添加新字符。当令牌完成时,我再次为其分配内存,并再次将其设置为“”。除了第一个标记外,整个想法似乎都在起作用 标记化函数和一些相关部分的代码如下: /* Returns a list of strings (tokens) that make up the infixString: */ ListOfStrings tokeni

我写了一个函数来表示一个数学表达式。它似乎工作得很好,除了一件事:第一个令牌的开头有一个垃圾值。我首先将变量currentToken声明为“”,然后在处理函数表达式时向其添加新字符。当令牌完成时,我再次为其分配内存,并再次将其设置为“”。除了第一个标记外,整个想法似乎都在起作用

标记化函数和一些相关部分的代码如下:

/* 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;iif(你试过调试吗?我没有调试经验。我只是在屏幕上打印令牌。首先,当前令牌应该初始化为NULL,而不是空字符串,空的输入中缀将很快证明这一点,因为你将向
free()传递一个只读文本地址
在上述情况下。此外,您的append函数会泄漏内存,因为您永远不会释放旧的缓冲区或使用我建议使用的
realloc
。在该代码中隐藏着一个明显的内存泄漏,它为单个字符分配内存,然后通过分配到字符串文本地址来立即覆盖分配结果,例如在以太中丢失分配。调试这个。我明白了。谢谢你的输入。