使用命令行界面和 malloc 创建计算器,
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
的 return 类型,使其 return 产生一些结果——修改结构(return 类型 Calc
) 或只是单个结果(return 输入 int
)。然后你会在函数中添加一个 return
语句到 return 值,并且在 main
例程中,你可以使用 x = SI(*pCalc);
分配 return编辑值 x
.
您可以将 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;
}
我正在研究 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
的 return 类型,使其 return 产生一些结果——修改结构(return 类型 Calc
) 或只是单个结果(return 输入 int
)。然后你会在函数中添加一个 return
语句到 return 值,并且在 main
例程中,你可以使用 x = SI(*pCalc);
分配 return编辑值 x
.
您可以将 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;
}