从数组传递令牌到strcmp

时间:2013-02-19 09:01:29

标签: c arrays string delimiter tcc

我要做的是打破用空格作为分隔符的部分中的用户输入,将部分复制到数组(tokenAr)并比较tokenAr[0](第一部分)它等于sHistory。如果它们相等,则检查tokenAr[1]的值(如果它是“1”,“2”等),以执行在history数组中输入的相应命令。这是我尝试过的,它崩溃了。我在Windows x64上使用TCC。 编辑:我忘了提到我两天前开始学习C语言。

EDIT2:我在调试器中运行该程序,它在行Acces Violation(Segmentation Fault)中引发了if(strcmp(tokenArPtr[0],sHistory)==0)

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

int main(int argc, char *argv[])
{   
    int i=1; int j=1; int k=0;
    char history[100][100] = {0};
    char sKey[] = "exit";
    char sInput[100];
    char sHistory[]="history";

    do 
    {
        //gather user input
        printf ("hshell> ");
        fgets (sInput, 100, stdin);
        strcpy(history[i],sInput);
        i++;
        //END_gather user input

        //Tokenizing

        char delims[] = " ";
        char *tokenArPtr[5];
        char *result = NULL;

        result = strtok(sInput, delims);
        tokenArPtr[0] = result;

        while (result!=NULL)
        {
              puts(result);
              result= strtok(NULL, delims);
              tokenArPtr[k+1] = result;

              puts(tokenArPtr[k]);
              puts("=====");
              k++;
        }
         k=0;
        /*
        //END_Tokenizing

        if(strcmp(tokenArPtr[0],sHistory)==0)
        {   
            for(j=1;j<i;j++)
            {
                printf("%d. %s \n",j,history[j]);
            }
        }

        else if (strcmp (sKey,tokenArPtr[0]) != 0)
        {
            printf("\nCommand not found \n");
        }*/
     }while (strcmp (sKey,sInput) != 0);  
    return 0;
}

编辑3:我直接使用result变量而不是tokenArPtr,但在调试时,我注意到数组的值没有更新。

3 个答案:

答案 0 :(得分:0)

strtok返回哪种类型? char *。 tokenAr [k]的类型是什么? char。 strcmp期望输入什么类型? char *char *。 tokenAr [0]的类型是什么? char

看到问题?你应该。 *非常重要。

假设tokenAr被声明为char *tokenAr[2];,那么tokenAr可以存储多少char *个值?当k超过2时会发生什么?您需要确保不会溢出tokenAr数组。

history未初始化。使用未初始化的变量是未定义的行为。我建议初始化它,如下所示:char history[100][100] = { 0 };

你在读哪本书?

答案 1 :(得分:0)

在进行标记化时,循环将永远不会结束,因为测试是在变量“结果”上永远不会改变...所以你最终会使用“tokenAr”进入缓冲区溢出...修改代码进行测试“tokenAr”。

编辑:而且tokenAR应该是一个数组......(我不知道它是如何编译的......)

答案 2 :(得分:0)

有很多问题......首先你应该包含string.h,它会在编译中显示一些错误。

我认为主要问题在于:

    char tokenAr[2];
        result = strtok(sInput, delims);
        while (result!=NULL)
        {
                tokenAr[k] = strtok(NULL, delims);
                k++;
        }

tokenAr应该是一个指针数组,而不是字符。你确定k永远不会超过2吗?断言有助于调试。