[英]Creating a Calculator using command line interface and malloc,
我正在研究 malloc 和命令行界面,我必須在其中創建簡單的計算器。 我已經成功運行了程序,但我想從主程序而不是從函數打印我的結果,我無法從主程序運行它。 每次我運行它都會顯示垃圾值。 什么地方出了錯?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdint.h>
typedef struct {
int num1;
int num2;
uint8_t *ope;
int result;
} Calc;
void SI( Calc c) {
if(strcmp(c.ope,"add")==0)
{
printf(" result is : %d\n :",c.result = (c.num1 + c.num2 ));
}
else if(strcmp(c.ope,"sub")==0)
{
printf(" result is :%d\n :",c.result = (c.num1 - c.num2 ));
}
}
int main(int argc,char *argv[]) {
Calc *pCalc = (pCalc *) malloc(sizeof(Calc));
pCalc ->ope = (argv[1]);
pCalc ->num1 = atoi (argv[2]);
pCalc ->num2 = atoi (argv[3]);
SI(*pCalc );
printf("result is: %d\n", pCalc ->result); // I want to print result here
free(pCalc );
return 0;
}
SI(*pCalc );
將結構的值(本質上是一個副本)傳遞給SI
,並且void SI( Calc c)
聲明SI
具有初始化為傳遞值的參數c
。 SI
對c
更改僅影響參數c
; 它們不影響main
的結構。
您可以更改SI(*pCalc );
到SI(pCalc);
以便它傳遞pCalc
的地址而不是它的值,並且您可以將函數聲明更改為void SI(Calc *c)
以便其參數c
是一個指針並被初始化為傳遞的地址。 在SI
內部,更改c.
到c->
。 .
運算符訪問結構的成員,而->
運算符訪問指向的結構的成員。
或者,您可以修改SI
的返回類型,使其返回一些結果——修改結構(返回類型Calc
)或僅返回單個結果(返回類型int
)。 然后,你還要加上return
語句轉換成函數返回值,並且,在main
例程中,你可以使用x = SI(*pCalc);
將返回值賦給x
。
您可以將pCalc
指針pCalc
給函數SI
(如@EricPostpischil 所建議的)並將其result
設置在那里。
此外,添加了更多修復。 請閱讀評論// CHANGE HERE
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
typedef struct
{ int num1;
int num2;
uint8_t *ope;
int result;
} Calc;
// CHANGE HERE - accept pointer argument
void SI(Calc* c) {
if (c == NULL)
{
return;
}
// CHANGE HERE - use strncmp instead of strcmp
if (strncmp(c->ope, "add", 3) == 0)
{
c->result = (c->num1 + c->num2);
}
else if (strncmp(c->ope, "sub", 3) == 0)
{
c->result = (c->num1 - c->num2);
}
}
int main(int argc,char *argv[]) {
// CHANGE HERE - command line arguments validation
if (argc != 4)
{
printf("Unexpected number of arguments\n");
exit(1);
}
// CHANGE HERE - pCalc -> Calc
Calc *pCalc = (Calc *) malloc(sizeof(Calc));
pCalc ->ope = (argv[1]);
pCalc ->num1 = atoi (argv[2]);
pCalc ->num2 = atoi (argv[3]);
SI(pCalc); // CHANGE HERE - pass the pointer
printf("result is: %d\n", pCalc->result); // I want to print result here
free(pCalc);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.