C 为什么我的strlen似乎在这个for循环中返回两个值?

C 为什么我的strlen似乎在这个for循环中返回两个值?,c,for-loop,strlen,C,For Loop,Strlen,基本上,我正在尝试使用我的C(基本)知识创建d&d骰子滚轮。在for-循环中,循环输入并返回骰子中的边数,strlen()似乎返回两个独立的值:1。正确的值为2。一个非常大的数字。我不明白它为什么返回第二个数字,这会弄乱for-循环 我已尝试将strlen()赋值给另一个名为length的变量,并在使用strlen()的函数中调用该变量。每次我在存在输入的函数中打印strlen()时,它都会打印正确的值,但一旦我将其传递给sides()它就会返回非常大的数字 #include <stdio

基本上,我正在尝试使用我的C(基本)知识创建d&d骰子滚轮。在
for
-循环中,循环输入并返回骰子中的边数,
strlen()
似乎返回两个独立的值:1。正确的值为2。一个非常大的数字。我不明白它为什么返回第二个数字,这会弄乱
for
-循环

我已尝试将
strlen()
赋值给另一个名为length的变量,并在使用
strlen()
的函数中调用该变量。每次我在存在输入的函数中打印
strlen()
时,它都会打印正确的值,但一旦我将其传递给
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);
}
#包括
#包括
#包括
#包括
int num();
内边();
int main()
{
printf(“这是一个D&D掷骰子模拟器!\n”);
int num_骰子,num_边;
num_dice=num();
num_sides=sides();
printf(“num%d边%d”,num_骰子,num_边);
}
int num()
{
int i,keynum,dice_num=0,长度;
char dice_inp[20];
printf(“输入骰子的数量(n),然后输入d,然后输入每个骰子的边数,使输入以“nds”的形式出现!\n”);
scanf(“%s”,dice_inp);
长度=abs(strlen(dice_inp));
keynum=strcspn(dice_inp,“d”);
对于(i=0;i1)
{
printf(“有%d个骰子被掷。\n”,骰子数量);
睡眠(500);
}
睡眠(500);
边(长度、骰子大小、键数);
返回骰子数;
}
整数边(整数长度,字符大小,整数键)
{
整数i,骰子的边=0;
对于(i=0;i1)
{
printf(“骰子将有%d个边。\n”,骰子边);
睡眠(500);
}
printf(“%d”,切面);
}

您的代码中有很多问题。 首先,功能“侧面”的定义如下:

但你称之为无参数

当您得到一个无效的输入时,在函数“num”中,您再次递归调用它,这会导致堆栈的浪费。最好使用循环。在同一个函数中,当您递归调用它时,您丢失了返回值。这意味着最后你得到了错误的值。该功能中的“睡眠”功能对我来说毫无意义

我猜strlen的问题与输入字符串不包含终止符这一事实有关。尝试在strlen之前使用printf跟踪输入


我在这里描述的问题不是唯一的

为什么要在
abs(strlen(dice_inp))中使用
abs
?@剑鱼地下城和龙使用不同边数的骰子,而不仅仅是传统的六面骰子。为什么不使用
scanf(“%dd%d”、&dice\u num,&sides)
?你确定你的问题来自
边(长度、骰子输入、键值)吗
在函数内调用
num
而不是从
num\u sides=sides()
在函数内调用
main
?从内部调用
sides()
时,不使用结果。然后在
main()。
int sides(int length, char dice_inp[], int keynum);
num_sides = sides();