C 为了寻求调试帮助,为什么这个标记器没有正确复制数组?

C 为了寻求调试帮助,为什么这个标记器没有正确复制数组?,c,tokenize,C,Tokenize,在这个赋值中,我必须在c中创建一个tokeniser函数,该函数在删除空格的同时将字符串的内容复制到另一个字符串中。它返回应该查找下一个标记的位置 令牌是一个字符字符串或单个运算符字符 在我的尝试中,检测并绕过空格的计数器会在第一个标记之后以某种方式停止将内容复制到结果字符串中。这是我的密码: int checkOperators(char str[], char operators[], int i){ int counter = 0; while(operators[coun

在这个赋值中,我必须在c中创建一个tokeniser函数,该函数在删除空格的同时将字符串的内容复制到另一个字符串中。它返回应该查找下一个标记的位置

令牌是一个字符字符串或单个运算符字符

在我的尝试中,检测并绕过空格的计数器会在第一个标记之后以某种方式停止将内容复制到结果字符串中。这是我的密码:

int checkOperators(char str[], char operators[], int i){
    int counter = 0;
    while(operators[counter]!='\0')
    {
        if(str[i]==operators[counter]) return 1;
        counter++;
    }
  return 0;
}

int tokenise_ops(char str[], int start, char result[], char operators[]){

    int i = start;
    int j = start;

    while(str[i]==' ' && str[i]!='\0'){
        i++;
    }

    if(checkOperators(str,operators,i)==1)
    {
        result[j]= str[i];
        i++;
        return i;
    }

    while(str[i]!='\0')
    {
        result[j]= str[i];
        i++;
        j++;
        if(str[i]==' ' || checkOperators(str,operators,i)==1) return i;
    }

    return -1;
}

int main()
{
    char str[]="26.6 * 7.9 + 3";
    char result[256];
    char operators[]={'+','-','*','/','^','\0'};

    int start=0;

    start = tokenise_ops(str,start,result,operators);
    while ( start != -1 )
    {
        printf("%s\n", result);
        start = tokenise_ops(str, start, result,operators);
    }
    printf("%s\n", result);

    return 0;
}

您的标记化功能可以是:

int tokenise_ops(char str[], int start, char result[], char operators[])
{
    int i = start;
    int j = 0;

    while ((str[i]==' ') && (str[i]!='\0'))
    {
        i++;
    }


    while(str[i]!='\0')
    {
        if(str[i]==' ' || checkOperators(str,operators,i)==1)
        {
            printf("Test2: %c\n", str[i]);
            result[j] = '\0';

            return i;
        }
        else
        {
            printf("Test: %c\n", str[i]);
            result[j] = str[i];
            i++;
            j++;
        }
    }

    result[j] = '\0';

    return -1;
}
  • j
    结果
    索引,因此每次调用都必须从
    0
    开始
  • 如果字符与令牌不匹配,则while循环应该存储字符,当找到令牌时,null终止结果
  • 当解析整个
    str
    时,
    result
    必须以null结尾

  • int j=start-->
    int j=0
    发布
    checkOperators
    函数。结果字符串不是以null结尾的。
    而(str[i]='')
    不处理str len(null终止符)抱歉,我在另一个版本中考虑了null终止符。如果while计数器不存在,它将在标记数组时打印数组的副本,但当它存在时,它将为每个标记打印“26.6”。感谢您的帮助,我去年9月才开始使用c。结果解决了我的担忧。我知道它很难看,效率不高,但它是我的,现在可以工作了。好吧,我删除了我的答案,我需要学习堆栈流协议。我确实对你的解决方案投了赞成票,但我没有足够的声誉来展示它。再次感谢。@Bitan78将答案设置为正确。是检查选票。不客气。