函数没有收到我作为 const char * 发送的内容

Function is not receiving what I send as a const char *

static char DEFAULT_DELIMITER = ',';
char *calculator_retrieveFirstToken(char *numbers, const char * delimiters) {
    //if (delimiters[strlen(delimiters)-1] == DEFAULT_DELIMITER)
    if (delimiters[1] == DEFAULT_DELIMITER) {
        return strtok(numbers, delimiters);
    }
    else {
        char linefeed = '\n';
        strtok(numbers, &linefeed);
        return strtok(NULL, delimiters);
    }
}

char calculator_findDelimiter(const char *numbers) {
    char delimiter = DEFAULT_DELIMITER;
    if (strlen(numbers) >= 4
        && numbers[0] == '/'
        && numbers[1] == '/') {
        delimiter = numbers[2];
    }
    return delimiter;
}

double calculator_add(char *numbers) {
    char delimiters[] = "\n";
    char *token = NULL;

    char mainDelimiter = calculator_findDelimiter(numbers);
    strcat(delimiters, &mainDelimiter);
    token = calculator_retrieveFirstToken(numbers, delimiters);
    return calculator_addEveryToken(token, delimiters);
}

最奇怪的事情发生在我调试 calculator_retrieveFirstToken 函数时。

数字输入示例:“”

mainDelimiter 等于','

调用 strcat 后:定界符等于:"\n,"

当我进入 calculator_retrieveFirstToken 函数时,分隔符参数等于: "\n,\n,"

我不明白这是怎么回事....我的 strcat 调用有问题吗?

这是主要内容

#include "calculator_kata.h"
#include <assert.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>

static char numbers[50];

static bool equals(const double expected, const double received)
{
    double epsilon = 1e-7;
    return fabs(received - expected) < epsilon;
}

static void test_addEmptyString_shouldReturnZero()
{
    strcpy(numbers, "");
    const double sum = calculator_add(numbers);
    assert(equals(0, sum));
}

static void test_addOneNumber_shouldReturnThisNumber()
{
    strcpy(numbers, "42");
    const double sum = calculator_add(numbers);
    assert(equals(42, sum));
}

static void test_addTwoNumbers_shouldReturnTheSum()
{
    const double TWENTY_ONE = 9+10;
    strcpy(numbers, "9,10");

    const double sum = calculator_add(numbers);

    assert(equals(TWENTY_ONE, sum));
}

static void test_addAnyQtyOfNumbers_shouldReturnTheSum()
{
    strcpy(numbers, "1,2,3,4,5");
    const double sum = calculator_add(numbers);
    assert(equals(15, sum));
}

static void test_inputWithNewLines_insteadOfCommas_shouldStillBeParsed()
{
    strcpy(numbers, "1\n2,3");
    const double sum = calculator_add(numbers);
    assert(equals(6, sum));
}

static void test_inputWithMultipleCommasBetweenNumbers_shouldReturnTheSum()
{
    strcpy(numbers, "1\n,2,,,,,,,3");
    const double sum = calculator_add(numbers);
    assert(equals(6, sum));
}

static void test_inputWithCustomDelimiter_shouldChangeDelimiter()
{
    strcpy(numbers, "//;\n1;2");
    const double sum = calculator_add(numbers);
    assert(equals(3, sum));
}

int main()
{
    test_addEmptyString_shouldReturnZero();
    test_addOneNumber_shouldReturnThisNumber();
    test_addTwoNumbers_shouldReturnTheSum();
    test_addAnyQtyOfNumbers_shouldReturnTheSum();
    test_inputWithNewLines_insteadOfCommas_shouldStillBeParsed();
    test_inputWithMultipleCommasBetweenNumbers_shouldReturnTheSum();
    test_inputWithCustomDelimiter_shouldChangeDelimiter();
    return 0;
}

strtokstrcat 接受指向 char 数组(即字符串)的指针,而 而不是 指向 char 多变的。也就是说,他们需要字符串终止符 ('[=15=]').

此外,在 calculator_add 中,您没有在 delimiters 中定义足够的 space,因此您的 strcat 会 运行 超过结尾,导致未定义的行为。

我已经用错误注释了您的来源并提供了修复。在可能的情况下,我已经完成了:// NOTE/BUG: ... #if 0 /* original code */ #else /* fixed code */ #endif:

static char DEFAULT_DELIMITER = ',';
char *calculator_retrieveFirstToken(char *numbers, const char * delimiters) {
    //if (delimiters[strlen(delimiters)-1] == DEFAULT_DELIMITER)
    if (delimiters[1] == DEFAULT_DELIMITER) {
        return strtok(numbers, delimiters);
    }
    else {
        // NOTE/BUG: this is incorrect -- you must pass a string pointer _not_
        // the address of a [single] character
#if 0
        char linefeed = '\n';
        strtok(numbers, &linefeed);
#else
        char *linefeed = "\n";
        strtok(numbers, linefeed);
#endif

        return strtok(NULL, delimiters);
    }
}

char calculator_findDelimiter(const char *numbers) {
    char delimiter = DEFAULT_DELIMITER;
    if (strlen(numbers) >= 4
        && numbers[0] == '/'
        && numbers[1] == '/') {
        delimiter = numbers[2];
    }
    return delimiter;
}

double calculator_add(char *numbers) {
    // NOTE/BUG: this defines only enough space for a single character and the
    // '[=10=]' so when it is concatenated to, it is undefined behavior [you're
    // running past the end of the string]
#if 0
    char delimiters[] = "\n";
#else
    char delimiters[4] = "\n";
#endif
    char *token = NULL;

    // NOTE/BUG: this repeats the same mistake with the strtok above
#if 0
    char mainDelimiter = calculator_findDelimiter(numbers);
    strcat(delimiters, &mainDelimiter);
#endif

    // NOTE: either of these will fix the strcat
#if 0
    char mainDelimiter = calculator_findDelimiter(numbers);
    char temp[2];
    temp[0] = mainDelimiter;
    temp[1] = 0;
    strcat(delimiters, temp);
#else
    delimiters[1] = calculator_findDelimiter(numbers);
    delimiters[2] = 0;
#endif

    token = calculator_retrieveFirstToken(numbers, delimiters);
    return calculator_addEveryToken(token, delimiters);
}