C _求和功能没有给出期望的结果

问题描述 投票:0回答:2

我一直在研究这个项目,我遇到了障碍。我完成了所有工作,但是一个细节在编译时无法正常工作。

您将编写一个程序,使用getch()函数从键盘读取字符。所有小写​​字母都将转换为大写字母,并使用putchar()函数打印到显示。所有大写字母都将使用putchar()打印。将累积所有个别数字,并使用printf()在程序结尾打印总和。您将编写自己的函数来返回字母的大写,不使用C库转换函数,以及使用当前字符数字接收当前总和的第二个函数,不要使用C库转换函数。转换数字函数将字符数字转换为十进制值,并将数字累加到返回新总和的总和。只有字母才能打印出来。程序将继续,直到收到返回,此时数字的总和将打印在下一行。输入内容:a9 wF23'; / 4i实际显示的行:aAwWFiI数字的总和为:18

我发布了我已经在下面工作的内容。 porgram除了需要求整数的部分(原来是字符但被转换)之外,它会做所有事情。它给了我一个非常大的数字,远大于输入数字的总和。

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#define ctrlz 26

char cvttoupper(char);
int cvtdigit(int, char);

int main ()
{
    int sum, d;
    char c, cupper;
    sum = 0;
    do  
    {   
        c = getch();

        if (c>='A' && c<='Z' || c>='a' && c<='z' )
        {   
            putch(c);
            if(c>='a' && c<='z')
            {   
                cupper = cvttoupper(c);
                putch(cvttoupper(c));                                       
            }   
        }   
        if (c>='0' && c<='9')
        {   
            d=c&0x0F;             
            sum = cvtdigit(sum,c);                      
        }   
    }   while (c != ctrlz);

    printf("\nThe sum of the digits is: %d\n", sum);

    system ("PAUSE");
    return 0;
}

char cvttoupper(char c)
{
    char cupper;
    cupper= c & 0x5F;
    return (cupper);
}

int cvtdigit(int d, char c)
{
    int sum;
    sum=sum+d;
    return (sum);        
}

非常感谢有关如何使求和部分正常工作的任何反馈。我怀疑这是与每个不正确的函数列出参数的方式。 (我不得不自己创建函数,不能使用C库函数)。

谢谢。

c
2个回答
1
投票

问题出在你的sum函数中:

int cvtdigit(int d, char c)
{
    int sum;
    sum=sum+d;
    return (sum);        
}

来自sum的原始main存储在d中。你最终要做的是创建一个名为num的新变量,该变量未初始化,将d(即sum中的main)的值添加到未初始化的sum并返回该值。这就是为什么你会得到奇怪的数字。

更改函数以删除sum并添加d(您应该重命名为sum)和c的值,首先从'0'中减去c,即字符0的字符代码,以便获得0到9之间的值。

int cvtdigit(int sum, char c)
{
    sum=sum+(c-'0');
    return sum;
}

1
投票

你将旧的sum传递给cvtdigit,你应该添加它,而不是使用未初始化的局部变量。

您可以通过从中减去'0'来获得数字的数值。

int cvtdigit(int sum, char c)
{
    int d = c - '0';
    sum += d;
    return sum;        
}
© www.soinside.com 2019 - 2024. All rights reserved.