Почему мой strlen, кажется, возвращает два значения в этом цикле for? - PullRequest
0 голосов
/ 14 мая 2019

В основном я пытаюсь создать ролик для игры в кости, используя мои (базовые) знания C. В цикле for, который должен циклически проходить через вход и возвращать количество сторон в кости, strlen() кажется, возвращает два отдельных значения: 1. правильное значение, 2. чрезвычайно большое число. Я не могу понять, почему он возвращает второе число, и это портит for -петл.

Я попытался присвоить strlen() другой переменной с именем length и вызвать ее в функции, где я использую strlen(). Каждый раз, когда я печатаю strlen() в функции, где существует вход dice_inp, он печатает правильное значение, но как только я передаю его в sides(), он возвращает чрезвычайно большое число.

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <math.h>

int num();
int sides();

int main()
{
    printf("This is a dice rolling simulator for D&D!\n");
    int num_dice, num_sides;
    num_dice = num();
    num_sides = sides();
    printf("num %d sides %d", num_dice, num_sides);
}

int num()
{
    int i, keynum, dice_num = 0, length;
    char dice_inp[20];

    printf("Input the number of dice(n), then d,then the number of sides of each dice(s) so the input appears n the form 'nds'!\n");
    scanf("%s", dice_inp);
    length = abs(strlen(dice_inp));

    keynum = strcspn(dice_inp, "d");

    for (i = 0; i < keynum; i++)
    {
        char c = dice_inp[keynum - 1 - i];
        c = c - '0';
        c = round(c*pow(10, i));
        dice_num += c;
    }

    if (dice_num == 1)
    {
        printf("There is %d dice being rolled.\n", dice_num);
        Sleep(500);
    }

    else if (dice_num == 0)
    {
        printf("You cannot roll 0 dice.\n");
        Sleep(500);
        num();
    }

    else if (dice_num > 1)
    {
        printf("There are %d dice being rolled.\n", dice_num);
        Sleep(500);
    }

    Sleep(500);
    sides(length, dice_inp, keynum);
    return dice_num;
}

int sides(int length, char dice_inp[], int keynum)
{
    int i, dice_sides = 0;

    for (i = 0; i < abs((length - keynum - 1)); i++)
    {
        char c = dice_inp[strlen(dice_inp) - 1 - i];
        c = c - '0';
        c = round(c*pow(10, i));
        dice_sides += c;
        printf("a");
    }

    if (dice_sides == 1)
    {
        printf("A dice cannot have one side. Please try again!\n");
        Sleep(500);
        num();
    }

    else if (dice_sides == 0)
    {
        printf("A dice cannot have 0 sides. Please try again.\n");
        Sleep(500);
        num();
    }
    else if (dice_sides > 1)
    {
        printf("The dice will have %d sides.\n", dice_sides);
        Sleep(500);
    }

    printf("%d", dice_sides);
}

1 Ответ

1 голос
/ 14 мая 2019

В вашем коде много проблем. Прежде всего, функция «стороны» определяется следующим образом:

int sides(int length, char dice_inp[], int keynum);

но вы называете это без параметров

num_sides = sides();

Когда вы получили неверный ввод, в функции "num" вы вызываете его снова рекурсивно, это приводит к пустой трате стека. Лучше использовать петлю. В той же функции, когда вы вызываете ее рекурсивно, вы теряете возвращаемое значение. Это означает, что в конце вы получите неправильное значение. Функция «Сон» внутри этой функции для меня не имеет смысла.

Я предполагаю, что проблема с strlen связана с тем, что входная строка не содержит терминатора. Попробуйте использовать printf, чтобы отследить ввод перед строкой.

Проблемы, которые я здесь описал, не единственные.

...