【2014】字符串(3)

题目描述(50分):

通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符
操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:

1、操作数为正整数,不需要考虑计算结果溢出的情况。

2、若输入算式格式错误,输出结果为“0”。

要求实现函数:

void arithmetic(const
char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr: 
输入字符串

lInputLen: 
输入字符串长度

【输出】 pOutputStr:
输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例

输入:“4 + 7”  输出:“11”

输入:“4 - 7”  输出:“-3”

输入:“9 ++ 7”  输出:“0”
注:格式错误


#define MAXCHAR 256

void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);

int main(void)
{
char pInputStr3[] = {"3 + 4"};

char pOutputStr3[MAXCHAR] = {0};

arithmetic(pInputStr3 , strlen(pInputStr3),pOutputStr3);

puts(pOutputStr3);
return 0;

}

void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr)
{

long i,locOfSpace;
int flag;
long numOfSpace=0;
if(pInputStr[0]==‘ ‘|| pInputStr[lInputLen-1]==‘ ‘) //输入串的开头结尾有空格非法
{
pOutputStr[0]=‘0‘ ;
pOutputStr[0]=‘\0‘;
return;
}
for(i=0;i<lInputLen;i++) //中间空格非法,例如"连着出现++"的情况
{
if(pInputStr[i]==‘ ‘)
{
locOfSpace = i;//输入合法则最终记录的肯定是第二个空格的位置
numOfSpace++;
if(numOfSpace == 1)
flag = 1;//flag = 1标记遇到的第一个空格;
else
flag = 0;
if(flag == 1 && pInputStr[i+2] !=‘ ‘) //判断条件要写全
{
pOutputStr[0]=‘0‘ ;//如果直接写pOutputStr=“0”,为什么非法时什么都不输出呢,不是应该输出0吗?
pOutputStr[0]=‘\0‘; //因为这样是把指针pOutputStr的值本身改变了,让pOutputStr指向了全局的字面值常量区,
//但作为形参pOutputStr不能回传给实参,所以要从本质上改变pOutputStr本身指向的区域。

return;
}
}
}
if(numOfSpace != 2) //空格数不等于2非法
{
pOutputStr[0]=‘0‘ ;
pOutputStr[0]=‘\0‘;
return;
}

char operat = pInputStr[locOfSpace-1];
char pnum1[256]={0},pnum2[256]={0};//给pnum1和pnum2不要声明成指针,因为要new进行初始化。声明为数组要指定数组大小。
long j = 0,k=0;

for(i=0;i<locOfSpace-2;i++)//第一个操作数存放到pnum1中
pnum1[j++]=pInputStr[i];
pnum1[j]=‘\0‘;

for(i=locOfSpace+1;i<=lInputLen;i++)//第一个操作数存放到pnum2中
pnum2[k++]=pInputStr[i];

long num1,num2,result;
num1 = atoi(pnum1);//atoi的参数直接是char*,如果参数是string则参数还得写成s.c_str()
num2 = atoi(pnum2);

if(operat == ‘+‘)
result = num1+num2;
else if(operat == ‘-‘)
result = num1-num2;
else
{
pOutputStr[0]=‘0‘ ;
pOutputStr[0]=‘\0‘;
return;
}

pOutputStr=itoa(result,pOutputStr,10);//result转换后存储到pOutputStr中

}

复习下面这道题:


//(1)
char *strA()
{
char str[] = "hello,world"‘;
return str;
}

//(2)
const char *strA()
{
char *str = "hello,world";
return str;
}

(1)是错误的,(2)是正确的,因为 char c[] ="hello,world";是分配一个局部数组(局部数组存放在函数的栈帧)

char *c = ="hello,world";是分配一个全局数组。(全局数据存放在全局区域)

【2014】字符串(3),布布扣,bubuko.com

时间: 2024-10-17 14:39:42

【2014】字符串(3)的相关文章

华为2014字符串笔试 2

通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串. 压缩规则: 1.仅压缩连续重复出现的字符.比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc". 2.压缩字段的格式为"字符重复的次数+字符".例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz". 要求实现函数:  void string

华为2014字符串笔试 1

通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉. 比如字符串“abacacde”过滤结果为“abcde”. 要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr); [输入] pInputStr:  输入字符串             lInputLen:  输入字符串长度          [输出] pOu

APUE学习笔记——6.10 时间与时间例程 time_t

Unix提供的最基本的时间服务室日历时间(纪元时间),也就是计算1970年1月1日0时0分0秒到当前的秒数.该秒数用time_t表示. typedef long time_t; /* 时间值time_t 为长整型的别名*/ 1.获取/设置时间 1.1 time和time_t 函数time()可以用于获取当前日历时间 #include <time.h> time_t time(time_t *calptr); Returns: value of time if OK,?1 on error 当前

linux下c编程入门笔记

一.基础知识 源程序编译 /***hello.c***/ int main() {printf("hello,world.\n"); return 0;} gcc -o hello hello.c -o生成可执行文件 -c只输出目标代码 -g可调试 makefile编写 ####makefile1#### main: main.o t1.o t2.o gcc -o [email protected] $^ main.o: main.c t1.h t2.h gcc -c $< t1

字符串2014年6月7日15:56:54

商业银行 具有创造活期存款的垄断经营特权,并主要发放工商业贷款的金融中介机构 混业经营 银行业.证券业和保险业的相互渗透与一体化经营 分业经营 银行业.证券业和保险业的业务严格分开,禁止业务交叉,彼此的资金不许相互融通 商业银行的流动性 商业银行满足存款人提取现金.支付到期债务和借款人正常贷款需求的能力 现金头寸 现金资产是指现金与现金等值的可随时变现流动性资产 贷款承诺 为借款人提供一定的贷款额度,在承诺期间借款人有权在任何时间使用这笔贷款 贷款出售 商业银行在贷款形成之后,将贷款债权出售给第

字符串 2014年6月7日12:51:07

1.单个字符也可以表示为字符串,还可以有长度为0的字符串(就是"",空字符串).null和""的区别,String.IsNullOrEmpty 1 string s = " ";//" "不是empty 2 3 //s == "" 相等于 s == string.Empty 4 if (string.IsNullOrEmpty(s))//等价于s == null || s == "" 5

字符串2014年6月7日17:29:44

---恢复内容开始--- 字符串替换:string Replace(string oldValue, string newValue)将字符串中的出现oldValue的地方替换为newValue.例子:名字替换. 1 string s = "abc1234"; 2 s = s.Replace("a", "A");//第一个参数是旧的,第二个是新的 3 Console.WriteLine(s); 取子字符串:string Substring(int

【2014】 字符串(2)

题目描述(40分): 通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串. 压缩规则: 1.仅压缩连续重复出现的字符.比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc". 2.压缩字段的格式为"字符重复的次数+字符".例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz". 要求实现函数: v

【2014】字符串(1)

一.题目描述(60分): 通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉. 比如字符串"abacacde"过滤结果为"abcde". 要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr); [输入] pInputStr:  输入字符串 lInputLen:  输入字符串长度 [