首页 > 解决方案 > 如何在没有 strtok 的情况下正确使用字符串拆分

问题描述

我正在尝试制作一个 C 字符串计算器。这意味着我有一个带有数字和中间分隔符的字符串。分隔符可以是任意大小,只要它不是数字即可。此外,如果特定数字的值介于 1001 和 1111 之间,则不能使用它并将被忽略(设置为零)。此分配的困难在于使定界/拆分字符串部分不带strtok. 我得到了各种错误的输出,我不知道我做错了什么,但我觉得我在疏忽某些事情或做一些非常愚蠢的事情。该代码还冻结了我的单元测试,所以我什至无法测试出了什么问题。

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

void ValidateInput(int *x) {
    if (*x >= 1001 && *x <= 1111) { 
        x = 0;
    }
}

int test(char *numbers, int numbers_length, int *result) {
    char cnum1[numbers_length];
    char cnum2[numbers_length];

    strcpy(cnum1, "");
    strcpy(cnum2, "");

    bool x = false;
    size_t i = 0;

    while (numbers[i] != '\0') {
        char c = numbers[i];
        if (isdigit(c)) {
            if (x) {
                strcat(cnum2, &c);
            }
            if (!x) {
                strcat(cnum1, &c);
            }
        }
        if (!isdigit(c)) {
            x = true;
        }
        i++;
    }

    int num1;
    num1 = atoi(cnum1);
    int num2 = atoi(cnum2);

    ValidateInput(&num1);
    ValidateInput(&num2);

    printf("%d\n", num1);
    printf("%d\n", num2);
    
    return num1 + num2;
}

int main() {
    int sum;
    char numbers[] = "100,10";
    int length = strlen(numbers);
    test(numbers, length, &sum);
    return -1;
}

标签: arrayscstringunit-testingpointers

解决方案


代码中存在一些问题:

  • x = 0inValidateInput()在函数之外没有任何影响。你应该写*x = 0;

  • strcat(cnum2, &c);不正确:&c不是正确的 C 字符串。您应该即时转换数字或使用索引附加字符。

  • test()不需要字符串的长度,它可以测试空终止符。

  • if (!x)并且if (!isdigit(c))是多余的,只需使用一个else子句。

  • test()返回总和,它不应将总和的地址作为参数,其返回值应存储summain()函数中。

这是修改后的版本:

#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>

void ValidateInput(int *x) {
    if (*x >= 1001 && *x <= 1111) { 
        *x = 0;
    }
}

int test(char *numbers) {
    int num1 = 0;
    int num2 = 0;
    bool x = false;

    for (size_t i = 0; numbers[i] != '\0'; i++) {
        unsigned char c = numbers[i];
        if (isdigit(c)) {
            if (x) {
                num2 = num2 * 10 + c - '0';
            } else {
                num1 = num1 * 10 + c - '0';
            }
        } else {
            x = true;
        }
    }

    ValidateInput(&num1);
    ValidateInput(&num2);

    printf("%d\n", num1);
    printf("%d\n", num2);
    
    return num1 + num2;
}

int main() {
    char numbers[] = "100,10";
    int sum = test(numbers);
    printf("sum=%d\n", sum);
    return 0;
}

推荐阅读