1.strindex(s, t) 返回字符串t在字符串s中首次出现的位置,没有返回-1
strrindex1(s, t) 和 strindex2(s, t)返回字符串t在字符串s中最右边的位置,没有返回-1 (4-1 以及 书本例子)
strrindex1(s, t) 和 strindex2(s, t)返回字符串t在字符串s中最右边的位置,没有返回-1 (4-1 以及 书本例子)
#include<stdio.h>
#include<string.h>
#define MAXLINE 100
int getline(char line[], int max);
int strindex(char source[], char searchfor[]);
int strrindex1(char source[], char searchfor[]);
int strrindex2(char source[], char searchfor[]);
char searchfor[] = "yi";
int main()
{
char line[MAXLINE];
int found = 0;
while(getline(line, MAXLINE) > 0)
{
printf("strindex = %d\n",strindex(line,searchfor));
printf("strrindex1 = %d\n",strrindex1(line,searchfor));
printf("strrindex2 = %d\n",strrindex2(line,searchfor));
}
}
int getline(char line[], int lim)
{
int c, i;
i = 0;
while( --lim > 0 && (c = getchar()) != EOF && c != '\n')
{
line[i++] = c;
}
if( c == '\n')
line[i++] = c;
line[i] = '\0';
return i;
}
int strindex(char source[], char searchfor[])
{
int i, j, k;
for(i = 0; source[i] != '\0'; i++)
{
for(j = i, k = 0; searchfor[k] != '\0' && source[j] == searchfor[k]; j++,k++)
;
if( k > 0 && searchfor[k] == '\0')
return i;
}
return -1;
}
int strrindex1(char source[], char searchfor[])
{
int i, j, k, pos = -1;
for(i = 0; source[i] != '\0'; ++i)
{
for(j = i, k = 0; searchfor[k] != '\0' && source[j] == searchfor[k]; ++j,++k)
;
if( k > 0 && searchfor[k] == '\0')
pos = i;
}
return pos;
}
int strrindex2(char source[], char searchfor[])
{
int i, j, k;
for(i = strlen(source) - strlen(searchfor); i >= 0; --i)
{
for(j = i, k = 0; searchfor[k] != '\0' && source[j] == searchfor[k]; ++j,++k)
;
if( k > 0 && searchfor[k] == '\0')
return i;
}
return -1;
}
2. atof(s) 把字符串s转化成浮点数作为返回值(该函数可以处理一般的单精度和带e的浮点数如“12.34”,“-12.34e-2”)
#include<stdio.h>
#include<ctype.h>
double atof(char s[])
{
int i, sign, exp;
float val, power;
i = 0;
while(isspace(s[i]))
i++;
sign = (s[i] == '-' ? -1 : 1);
if(s[i] == '-' || s[i] == '+')
i++;
val = 0;
while(isdigit(s[i]))
{
val = val * 10 + (s[i] - '0');
i++;
}
if(s[i] == '.')
i++;
power = 1.0;
while(isdigit(s[i]))
{
val = val * 10.0 + (s[i] - '0');
i++;
power *= 10.0;
}
val = sign * val / power;
if(s[i] == 'e' || s[i] == 'E')
i++;
sign = (s[i] == '-' ? -1 : 1);
if(s[i] == '-' || s[i] == '+')
i++;
exp = 0;
while(isdigit(s[i]))
{
exp = exp * 10 + (s[i] - '0');
i++;
}
if( sign == 1)
{
while( exp-- > 0 )
val = val * 10.0;
}
else
{
while( exp-- > 0)
val = val / 10.0;
}
return val;
}
int main()
{
char s[100]=" -12.34e-2";
scanf("%s%*c",s);
printf("result = %f\n",atof(s));
getchar();
return 1;
}
3. 输入逆波兰式的字符串,求出它的的值(ex > 1 2 - 4 5 + *)(课本p63例题)
#include<stdio.h>
#include<stdlib.h>
#define MAXOP 100
#define NUMBER '0'
void push(double s);
double pop();
int getop(char s[]);
int main()
{
int type;
double op2;
char s[MAXOP];
while((type = getop(s))!= EOF)
{
switch(type)
{
case NUMBER:
push(atof(s));
break;
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if(op2 == 0.0)
printf("error: zero divisor\n");
else
push(pop() / op2);
break;
case '\n':
printf("%8.8f\n", pop());
break;
default:
printf("error: unknown command! \n");
break;
}
}
getchar();
return 1;
}
#define MAXVAL 100
int sp = 0;
double val[MAXVAL];
void push(double s)
{
if(sp >= MAXVAL)
printf("error: stack is full\n");
else
val[sp++] = s;
}
double pop()
{
if(sp <= 0)
{
printf("error: stack is empty\n");
return 0;
}
else
return val[--sp];
}
#include<ctype.h>
int getch();
void ungetch(int c);
int getop(char s[])
{
int i, c;
while( (c= s[0]= getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if(!isdigit(s[0]) && c != '.')
return c;
i = 0;
if(isdigit(c))
while(isdigit(c = s[++i] = getch()))
;
if(c == '.')
while(isdigit(c = s[++i] = getch()))
;
s[i] = '\0';
if( c != EOF)
ungetch(c);
return NUMBER;
}
#define BUFSIZE 100
int buf[BUFSIZE];
int bufp = 0;
int getch()
{
return (bufp > 0)? buf[--bufp]: getchar();
}
void ungetch(int c)
{
if( bufp >= BUFSIZE)
printf("error: bufstack is full!\n");
else
buf[bufp++] = c;
}
4.在课本的基础上加入取模预算,以及考虑负数的情况。
//其中main函数和getop函数的改变:
int main()
{
int type;
double op2;
char s[MAXOP];
while((type = getop(s))!= EOF)
{
switch(type)
{
case NUMBER:
push(atof(s));
break;
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if(op2 == 0.0)
printf("error: zero divisor\n");
else
push(pop() / op2);
break;
case '%':
op2 = pop();
if(op2 == 0.0)
printf("error: zero divisor\n");
else
push(fmod(pop(),op2));
break;
case '\n':
printf("%8.8f\n", pop());
break;
default:
printf("error: unknown command! \n");
break;
}
}
getchar();
return 1;
}
int getop(char s[])
{
int i, c;
while( (c= s[0]= getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if(!isdigit(s[0]) && c != '.' && c != '-')
return c;
i = 0;
if( c == '-')
{
if(isdigit(c = getch()) || c == '.')
s[++i] = c;
else
{
if( c != EOF)
ungetch(c);
return '-';
}
}
if(isdigit(c))
while(isdigit(c = s[++i] = getch()))
;
if(c == '.')
while(isdigit(c = s[++i] = getch()))
;
s[i] = '\0';
if( c != EOF)
ungetch(c);
return NUMBER;
}
5. 增加一些变量,以及结果保存在v中(4-6 可在表达式过程中添加 2 A = 这些赋值语句以及保存上一个表达式的值在v中 如: v 1 +)只需要改动main
int main()
{
int type, i, var = 0;
double op2, v;
char s[MAXOP];
double variable[26];
for( i = 0; i < 26; i++)
variable[i] = 0.0;
while((type = getop(s))!= EOF)
{
switch(type)
{
case NUMBER:
push(atof(s));
break;
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if(op2 == 0.0)
printf("error: zero divisor\n");
else
push(pop() / op2);
break;
case '%':
op2 = pop();
if(op2 == 0.0)
printf("error: zero divisor\n");
else
push(fmod(pop(),op2));
break;
case '\n':
v = pop();
printf("%8.8f\n", v);
break;
case '=':
pop();
if( var >= 'A' && var <= 'Z')
variable[var - 'A'] = pop();
else
printf("error: no variable name! \n");
break;
default:
if(type >= 'A' && type <= 'Z')
push(variable[type - 'A']);
else if (type == 'v')
push(v);
else
printf("error: unknown command! \n");
break;
}
var = type;
}
getchar();
return 1;
}
6. 用getline(line,limit)输入一行输入来代替getch() 和 ungetch() 函数
#include<stdio.h>
#include<stdlib.h>
#define MAXOP 100
#define NUMBER '0'
int getop(char s[]);
void push(double f);
double pop();
int main()
{
int type;
double op2;
char s[MAXOP];
while( (type = getop(s)) != EOF)
{
switch(type)
{
case NUMBER:
push(atof(s));
break;
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if( op2 != 0.0)
push(pop() / op2);
else
printf("error: zero divisor\n");
break;
case '\n':
printf("\t%.8g\n",pop());
break;
default:
printf("error: unknown command %s \n",s);
break;
}
}
return 0;
}
#define MAXVAL 100
int sp = 0;
double val[MAXVAL];
void push(double f)
{
if(sp < MAXVAL)
{
val[sp++] = f;
}
else
printf("error: stack full, can't push %g\n",f);
}
double pop()
{
if(sp > 0)
return val[--sp];
else
{
printf("error: stack empty\n");
return 0;
}
}
#include<ctype.h>
#define MAXLINE 100
int getline(char s[],int limit);
char line[MAXLINE];
int li = 0;
int getop(char s[])
{
int i, c;
if(line[li] == '\0')
{
if( getline(line,MAXLINE) == 0)
return EOF;
else
li = 0;
}
while((s[0] = c = line[li++]) == ' ' || c == '\t')
;
s[1] = '\0';
if(!isdigit(s[0]) && c != '.')
return c;
i = 0;
if(isdigit(c))
{
while(isdigit(s[++i] = c = line[li++]))
;
if(c == '.')
while(isdigit(s[++i] = c = line[li++]))
;
s[i] = '\0';
li --;
return NUMBER;
}
}
int getline(char line[], int limit)
{
int c;
int i = 0;
while( --limit > 0 && (c = getchar()) != EOF && c != '\n')
line[i++] = c;
if( c == '\n')
line[i++] = '\n';
line[i] = '\0';
return i;
}