【问题标题】:My functions are not working properly in C?我的函数在 C 中不能正常工作?
【发布时间】:2022-01-12 13:27:20
【问题描述】:

我正在尝试使用 C 来做一个简单的计算器。我已经创建了 4 个函数,分别是加法、乘法、减法和除法。但是,当我调用主函数中的函数时,它们无法正常工作。即使我输入“+”、“-”、“/”,结果也总是相乘。这里可能有什么问题?

一些词的翻译要清楚:arti = plus,eksi = minus,carpi = cross,bolum = 除,carpim = 乘,toplama = 加,cikartma = 减,bolme = 除

谢谢:)

#include <stdio.h>
#include<stdlib.h>
#include<string.h>

int carpim(int numOne, int numTwo, int result){
    
    result = numOne * numTwo;
    printf("Sonuc: %d", result);
    return 0;
    
}

int toplama(int numOne, int numTwo, int result){
    
    result = numOne + numTwo;
    printf("Sonuc: %d", result);
    return 0;
    
}

int cikartma(int numOne, int numTwo, int result){
    
    result = numOne - numTwo;
    printf("Sonuc: %d", result);
    return 0;

}

int bolme(int numOne, int numTwo, int result){
    
    result = numOne / numTwo;
    printf("Sonuc: %d", result);
    return 0;

}

int main(){
    
    char islem[0];
    char arti[] = "+";
    char eksi[] = "-";
    char carpi[] = "x";
    char bolum[] = "/";
    int sayiBir;
    int sayiIki;
    int sonuc = 0;
    
    printf("(+)\n(-)\n(x)\n(/)\nIstediginiz islemin sembolunu girin:");
    scanf("%c", islem);
    
    printf("Ilk sayiyi girin: ");
    scanf("%d", &sayiBir);
    printf("Ikinci sayiyi girin: ");
    scanf("%d", &sayiIki);
    
    if (strcmp(islem, arti)) {
        toplama(sayiBir, sayiIki, sonuc);
    }
    else if (strcmp(islem, carpi)){
        carpim(sayiBir, sayiIki, sonuc);
    }
    else if (strcmp(islem, eksi)){
        cikartma(sayiBir, sayiIki, sonuc);
    }
    else if (strcmp(islem, bolum)){
        bolme(sayiBir, sayiIki, sonuc);
    }
    
}

【问题讨论】:

  • 您正在创建 char 数组 (char art[]) - 您确定要这样做吗?
  • char islem[0]; 创建一个零数组char。这不是 C 标准定义的,你的编译器应该警告你。注意你的编译器警告。 islem 至少需要两个char,一个用于从用户读取的字符,一个用于终止空字符,在与strcmp 一起使用之前,您必须将其存储到islem[1]。或者您可以修改代码以比较单个 char 对象,而不是使用 char 的数组作为运算符。

标签: c function runtime-error calculator


【解决方案1】:

你有两个主要问题:

  • 首先是数组islem是一个由个元素组成的数组,它不能容纳任何东西,更不用说以null结尾的字符串了

  • 第二个问题是您读取单个字符,并在将其传递给strcmp 函数时尝试将其用作以空字符结尾的字符串(str 前缀意味着它处理以空字符结尾的字符串)。

要解决这些问题,请将islem 设为单个字符:

char islem;

并使用scanf 传递指针来读取它:

scanf(" %c", &islem);

然后使用普通的比较运算符进行比较:

if (islem == '+') {
    toplama(sayiBir, sayiIki, sonuc);
}

另一方面,您不需要sonuc 变量,也不应将其传递给函数。相反,该函数可以在本地定义 result 变量:

void carpim(int numOne, int numTwo){
    int result = numOne * numTwo;
    printf("Sonuc: %d", result);
}

你也不需要result 变量:

void carpim(int numOne, int numTwo){
    printf("Sonuc: %d", numOne * numTwo);
}

【讨论】:

  • 非常感谢...我刚开始学习 C 语言,并且因为我开始使用更轻松的语言(如 Swift 和 c#)而经历了一段艰难的时期。考虑到您指出的关键点比简单的答案更多,您的回答很有帮助。 :)
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
相关资源
最近更新 更多