1

我想要做的是用空格作为分隔符来分解用户输入,将这些部分复制到数组(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直接使用变量,但是在调试时,我注意到数组的值没有被更新。

4

3 回答 3

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 };

你在看哪本书?

于 2013-02-19T09:08:37.630 回答
0

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

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

于 2013-02-19T09:09:05.730 回答
0

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

我相信主要问题在这里:

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

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

于 2013-02-19T09:09:09.110 回答