C语言 使用 strtok() 拆分字符串出错



我试图在动态分配输入的同时从用户那里获取输入,然后使用 strtok "拆分"它。

主要问题:

  1. 我得到一个"a{\300_\377"和","的无限循环。
  2. 为什么我会收到"隐式声明库函数"malloc"/"realoc"类型为 void"的警告

其他不太重要的问题:

3.我想中断,如果输入包含"-1",如何检查?如您所见,如果它的 1,它现在会中断。

4.In getsWordsArray()中,我想返回一个指向字符串数组的指针。由于我不知道有多少个字符串,所以我还需要像在getInput()中一样动态分配它。(我不知道每个字符串中有多少个字符)

   int main(int argc, const char * argv[])
    {
        char input = getInput();
         getWordsArray(&input);  
    }
    char getInput()
    {   
        char *data,*temp;
        data=malloc(sizeof(char));
        char c; /* c is the current character */
        int i; /* i is the counter */
        printf ("n Enter chars and to finish push new line:n");
        for (i=0;;i++) {
            c=getchar(); /* put input character into c */
            if (c== '1')                // need to find a way to change it to -1
                break;
            data[i]=c; /* put the character into the data array */
            temp=realloc(data,(i+1)*sizeof(char)); /* give the pointer some memory */
            if ( temp != NULL ) {
                data=temp;
            } else {
                free(data);
                printf("Error allocating memory!n");
                return 0 ;
            }
        }   
        printf("list is: %sn",data); // for checking
        return *data;     
    }
    void getWordsArray(char *input)
    {
        char *token;
        char *search = " ,";
        token = strtok (input,search);
        while (token != NULL ) {
            printf("%sn",token);
            token = strtok(NULL,search);
        }
    }

编辑:我注意到我忘记了"strtok"命令,所以我将其更改为token = strtok(NULL,search);

我仍然在 printf 上得到奇怪的输出:

327{300_377

更改:

int main(int argc, const char * argv[])
{
    char input = getInput();
    getWordsArray(&input);  
}

自:

int main(int argc, const char * argv[])
{
    char *input = getInput();
    getWordsArray(input);  
}

与返回值类似 getInput()

char *getInput()
{   
    // ...
    return data;
}

在您的代码中,您只保存输入字符串的第一个字符,然后将大部分垃圾传递给getWordsArray()

对于您的malloc()问题,man malloc开头为:

SYNOPSIS
   #include <stdlib.h>

对于您的getchar()问题,也许请参阅我正在尝试理解getchar()!= EOF等。

瑟夫回答问题1。

Q2:mallocrealoc 返回类型 void * 。您需要将其显式转换为 char * .试试这个:

data = (char *) malloc(sizeof(char));

Q3:1可以解释为一个字符。 -1 在转换为字符时,相当于字符串 "-1",其中包含字符 "-" 和 "1"。为了检查 -1,您需要使用 strcmpstrncmp 与字符串"-1"进行比较。

Q4:如果要返回其他副本,是的,动态分配内存是个好主意。或者,您可以将指向每个令牌的所有指针放入数据结构(如链表)中以供将来参考。这样,您可以避免制作副本,只允许访问字符串中的每个令牌。

错误的地方:

  1. C 中的字符串以 null 结尾。printf %s论点的意思是"继续打印字符,直到你达到''"。由于您在打印之前不会对data进行空终止,因此printf data的末尾运行并仅打印堆(恰好不包含任何空字节来阻止它)。

  2. #include了什么标题?缺少<stdlib.h>是隐式声明malloc的最明显原因。

  3. getInput按值返回data的前char。这不是你想要的。(getWordsArray永远行不通。另请参阅 1.)

建议:

以下是打破-1的一个想法:if ((c == '1') && (data[i-1] == '-'))

要获得字符串数组,您确实需要一个动态的char *数组。您可以malloc一个新字符串来复制strtok返回的每个token,或者直接将每个token作为指针保存到 input 中。

相关内容

  • 没有找到相关文章

最新更新