首页 文章

指针算术的问题 - 尝试标记输入字符串

提问于
浏览
0

目前我正在开发一个程序,允许用户输入一个字符串然后进行标记化,然后使用指针数组将标记打印到屏幕上 . 通过调用我的tokenize函数来“执行”这个操作,该函数读取输入字符串直到第一个分隔符('',',',' . ','?','!') . 然后它将我的字符串中的分隔符更改为NULL char . 然后它应该返回一个指向我的字符串中的下一个字符的指针 . 在输入字符串之后的main中,它应该继续调用tokenize函数,该函数返回指针,然后存储在指针数组中以便稍后打印我的标记 . 一旦tokenize()返回一个指向NULL字符的指针,该字符位于我的字符串的末尾,它就会从该循环中断开 . 然后我使用我的指针数组打印出令牌 . //试图详细说明

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

char *tokenize ( char *text, const char *separators );

int main ( void )
{
        char text[30];
        char separators[6] = { ' ','.',',','?','!','\0'};
        char *pch = NULL;
        int tokens[15];
        int i = 0;
        int j = 0;

        printf("Enter a string: \n");
        fgets( text, 30, stdin );

        printf("%s", text );

        pch = tokenize ( text, separators );

        do
        {
                pch = tokenize ( pch, separators );
                //printf("%c", *pch);
                tokens[i] = pch;
                i++;
        }
        while( *pch != NULL );


        i--;
        while( j != i )
        {
                printf("%s", tokens[i] );
                j++;
        }

        return 0;
}

char *tokenize ( char *text, const char *separators )
{
        while( text != NULL )
        {

                if( text != NULL )
                {
                        while( separators != NULL )
                        {
                                if( text == separators )
                                {
                                        text = '\0';
                                }
                                separators++;
                        }
                }
                text++;
        }
        return text;


}

目前有3大问题 . 1.当我编译时,它读取字符串然后打印它,然后陷入无限循环,没有任何打印,仍然试图获得输入 . 我很确定我在错误的地方用我的指针“*” . 3.我的函数传入对我的数组的引用,所以我假设我可以按原样递增它们 .

我感谢任何反馈!我会不断看这篇文章 . 如果我留下一些不清楚的东西,我可以重新指定 . 谢谢 .

2 回答

  • 0

    您有正确的想法来解决问题,但您的代码中有很多 pointer/int 错误 . 确保使用 Warnings enabled 编译代码,这将告诉您代码中的问题所在 . (在您解决并消除所有警告之前,不要指望您的代码能够正确运行) . 至少,在构建命令中使用 -Wall -Wextra 选项进行编译 .

    有很多简单的方法可以做到这一点,但对于学习体验,这是一个很好的练习 . 以下是纠正错误的代码 . 在可能的情况下,我保留了原始代码 commented ,以便您可以查看问题所在 . 我还包含一些代码,用于删除 text 末尾 fgets 所包含的 newline . 虽然这不是必需的,但最好不要在代码中使用过滤器.1791319_过滤器 .

    如果您有疑问,请告诉我:

    #include <stdio.h>
    #include <string.h>
    
    char *tokenize ( char *text, const char *separators );
    
    int main ( void )
    {
            char text[30];
            char separators[6] = { ' ','.',',','?','!','\0'};
            char *pch = NULL;
            char *tokens[15] = {0};             /* declare array of pointers    */
            int i = 0;
            int j = 0;
    
            printf("Enter a string: \n");
            fgets( text, 30, stdin );
            size_t len = strlen (text);
    
            if (text[len-1] == '\n')            /* strip newline from text      */
                text[--len] = 0;
    
            pch = text;                         /* pch pointer to next string   */
            char *str = text;                   /* str pointer to current       */
    
            do
            {
                    pch = tokenize ( str, separators ); /* pch points to next   */
                    tokens[i++] = str;                  /* save ptr to token    */
                    str = pch;                          /* new start of str     */
            }
            while (pch != NULL && *pch != 0);           /* test both pch & *pch */
    
            printf ("\nTokens collected:\n\n");
            while (tokens[j])                   /* print each token             */
            {
                    printf("  token[%d]: %s\n", j, tokens[j] );
                    j++;
            }
            printf ("\n");
    
            return 0;
    }
    
    char *tokenize ( char *text, const char *separators )
    {
            const char *s = separators;     /* must use pointer to allow reset  */
    
            //while( text != NULL )
            while( *text != '\0' )
            {
                    s = separators;         /* reset s                          */
                    while( *s != 0 )        /* 0 is the same as '\0'            */
                    {
                            //if( text == separators )
                            if( *text == *s )
                            {
                                    //text = '\0';
                                    *text = '\0';
                                    return ++text;
                            }
                            s++;
                    }
                    text++;
            }
            return text;
    }
    

    Example output:

    $ ./bin/tokenizestr
    Enter a string:
    This is a test string
    
    Tokens collected:
    
      token[0]: This
      token[1]: is
      token[2]: a
      token[3]: test
      token[4]: string
    
  • 0

    也许你会想看看 strsep 和这篇文章Split string with delimiters in C如果你需要更多的参考点,试试搜索"split string"如果我理解正确你想要做的事情 .

相关问题