计算字符串“25 + 32 = ”
#include<stdio.h> #include<string.h>int calc_string(char *s) {char buf1[100] = {0};char oper = 0;char buf2[100] = {0};int len = strlen(s);int i;for(i = 0; i < len; i++){if( '+' == s[i] || '-' == s[i] || '*' == s[i] || '/' == s[i] ){strncpy(buf1,s,i);oper = s[i];break;}}int start = i + 1;for(; i < len; i++){if(s[i] == '='){strncpy(buf2,&s[start ],i - start);}}printf("buf1 = %s,oper = %c,buf2 = %s\n",buf1,oper,buf2);int a = atoi(buf1);int b = atoi(buf2);switch(oper){case '+':return a+b ;case '-':return a-b;case '*':return a*b;case '/':if(a)return a/b;else return 0;}}int main() {char *s = "25 + 46 = ";printf("%d\n",calc_string(s));return 0; }
计算文本文件中的计算:
/*** a.txt ***/ 23 + 45 = 45 * 12 = 56 / 2 = 45- 12 =
/*** calc.c ***/ #include<stdio.h> #include<string.h>int calc_string(char *s) {char buf1[100] = {0};char oper = 0;char buf2[100] = {0};int len = strlen(s);int i;for(i = 0; i < len; i++){if( '+' == s[i] || '-' == s[i] || '*' == s[i] || '/' == s[i] ){strncpy(buf1,s,i);oper = s[i];break;}}int start = i + 1;for(; i < len; i++){if(s[i] == '='){strncpy(buf2,&s[start ],i - start);}}//printf("buf1 = %s,oper = %c,buf2 = %s\n",buf1,oper,buf2);int a = atoi(buf1);int b = atoi(buf2);switch(oper){case '+':return a+b ;case '-':return a-b;case '*':return a*b;case '/':if(a)return a/b;else return 0;}}void cuterrturn(char *s) {int len = strlen(s);if('\n' == s[len - 1]){s[len - 1] = 0;} }int main() {FILE *p = fopen("./a.txt","r");FILE *p1 = fopen("./b.txt","w");char buf[1024];char buf1[1024];while(!feof(p)){memset(buf,0,sizeof(buf));fgets(buf,sizeof(buf),p); //从文件中读一行记录,字符串最后是以’\n’结尾cuterrturn(buf); //吃掉从文件每行读出来的换行符int value = calc_string(buf);memset(buf1,0,sizeof(buf));sprintf(buf1,"%s%d\n",buf,value);fputs(buf1,p1);}fclose(p);fclose(p1);return 0; }
运行结果;
运行结果; b.txt 23 + 45 = 68 45 * 12 =540 56 / 2 = 28 45- 12 =33 0
分析:最后面多一个0是因为用feof判断是否到达文件结尾会多循环一次。
strncpy()函数:将指定长度的字符串复制到字符数组中
语法:
char *strncpy(char *destinin, char *source, int maxlen);
参数:
destinin:表示复制的目标字符数组;
source:表示复制的源字符数组;
maxlen:表示复制的字符串长度。