【问题标题】:Trying to write a program to sum the value of an int and a char试图编写一个程序来对 int 和 char 的值求和
【发布时间】:2019-05-11 04:28:43
【问题描述】:

我正在尝试用 C 编写一个程序来对整数和字符的值求和。如果用户在字符应该在的位置输入一个整数,我希望我的程序计算这 2 个整数的值。我下面的代码适用于用户输入 2 个整数,但最多只能计算 9(例如:4 5:“字符 '4' 代表一个数字。'4' 和 '5' 的总和是 9”)。如果用户输入5 6,则结果为:“字符'5'代表一个数字。'5'和'6'之和为;”。我一直在寻找一段时间,任何潜在的解决方案总是会导致不正确的总和。我还希望我的程序接受高于 '9' 的用户输入(例如:20 50),但是如果我将 '9' 更改为 '99',我会收到以下警告:“警告:多字符字符常量 [-Wmultichar ]”。有人可以为我指明实现这些目标的正确方向吗?

#include <stdio.h>
int sum (int m, char n){
    return m+n;
}

int main(){
    char ch;
    int c;
    printf("Enter an integer and a character separated by a blank> ");
    scanf("%d %c",&c, &ch);
    if((c >= '0' && c <= '9')||(ch >= '0' && ch <= '9')){
        int cs = sum(c, ch - 0);
        printf("Character '%d' represents a digit. Sum of '%d' and '%c' is %d" , c, c, ch - 0, cs);
    }
    return 0;
}

【问题讨论】:

    标签: c integer character


    【解决方案1】:
    int cs = sum(c, ch - 0);
    

    看起来您试图通过从用户输入的任何字符中减去 0 的 ASCII 值来解释 ASCII 值。但是,当您想使用字符文字“0”时,您使用了整数文字 0。见下文:

    int cs = sum(c, ch - '0');
    

    另外,我建议将您的 int 重命名为 i 或 c 以外的其他名称。区分 c 和 ch 的类型有点困难。

    也考虑改变

    if((c >= '0' && c <= '9')
    

    if((c >= 0 && c <= 9)
    

    c 是一个整数,你应该这样比较它。通过使用 ' ',您基本上是在对 char 变量进行强制转换,这在此处是不必要的。 另一个问题是,我认为您无法使用 char 变量作为两位数来完成您想要做的事情。 char 变量可以保存单个字符,而两位数由两个字符组成。

    【讨论】:

    • 谢谢!这确实奏效了。但是,如果用户在字符应为的位置输入大于 9 的值(例如:10 10),则结果是“字符 '10' 表示一个数字。'10' 和 '1' 的总和是 11”。它似乎只使用了第一个数字(例如:10 20:字符“10”代表一个数字。“10”和“2”之和为 12)。
    • 查看我对此的编辑。抱歉,您似乎仍在对我回答的问题进行编辑,或者我可能只是错过了那个特定问题。
    • 我明白了。这就说得通了。谢谢你的澄清。我想我将不得不接受小于 10 的整数(字符应该在哪里)。感谢您的努力。感谢您花时间帮助 C 菜鸟。
    【解决方案2】:

    抱歉,我无法发表评论,因此我将针对仅使用一位数字的问题添加此答案。

    你只有一个字符

    char ch;
    

    所以它只读取一个字符,你需要一个字符数组,比如char ch[10]

    然后您将使用int foo = atoi(ch) 将您的数组转换为整数

    【讨论】:

    • 谢谢。我现在将阅读字符数组。非常感谢。
    • atoi 不期望 nul-terminated 字符串作为其参数吗? (同样在执行字符串转换时使用strtol,因为atoi 提供零错误检查)
    • @MarkusZ 请记住,这两个函数会将您的字符数组转换为整数(或长整数),这意味着您最终将以与上面处理 int c 相同的方式处理它。如果您想练习使用库函数,这还不错,但相当多余,因为您可以让您的用户从一开始就指定两个整数。
    • @DavidC.Rankin 它停在第一个“非数字”字符处。那将是carriet return,不是吗?
    • 不,它会在你的堆栈中尖叫,直到它意外找到一个零 (nul) 字符来指示字符串结束 :) 记住一个“字符串”在 C 中总是 nul-terminated,例如"Hi" 实际上是 { 'H', 'i', '\0' }。这里char ch不能代表字符串,因为它是单个字符。
    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多