【问题标题】:passing tokens from array to strcmp将令牌从数组传递到 strcmp
【发布时间】:2013-02-19 09:01:29
【问题描述】:

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

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

#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,但是在调试时,我注意到数组的值没有被更新。

【问题讨论】:

  • 你试过在调试器中运行它吗?
  • @JoachimPileborg No. @hmjd 我应该在它退出while循环后设置k=0吗? (就在 end_tokenizing 评论之前)

标签: c arrays string delimiter tcc


【解决方案1】:

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

你在看哪本书?

【讨论】:

  • 根据您的建议编辑了代码。为简单起见,可以说它永远不会超过两个。还在崩溃。我正在阅读 Head First C。
  • k++ 后跟测试 tokenArPtr[k]!=NULL 是未定义的行为,因为 tokenArPtr[k] 未初始化。我希望那会崩溃。考虑:for (k = 0; k &lt; sizeof tokenArPtr / sizeof *tokenArPtr; k++) { tokenArPtr[k] = strtok(NULL, delims); if (tokenArPtr[k] == NULL) { break; } }
  • 我将使用不会崩溃的最新更改编辑代码,但正如您将看到的,我无法更新数组值。更新了代码。
【解决方案2】:

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

编辑:而tokenAR应该是一个数组……(不知道怎么编译……)

【讨论】:

  • 做到了,但还是一样。
【解决方案3】:

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

我认为主要的问题在这里:

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

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

【讨论】:

  • 你没有删除错误...您仍然检查一个常量值...您必须检查最后写入的指针
猜你喜欢
  • 1970-01-01
  • 2014-09-24
  • 2014-10-12
  • 2011-07-29
  • 2021-08-05
  • 1970-01-01
  • 2019-10-27
  • 2021-06-30
  • 2018-10-23
相关资源
最近更新 更多