《算法竞赛入门经典》3.4.4 重新实现库函数

练习 1:

只用 getchar 函数读入一个整数。假设它占据单独的一行,读到行末为止,包括换行符。输入保证读入的整数可以保存在 int 中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* ziqin 2014 */
#include <stdio.h>
int input_int(void);
int main(void)
{
int n;
n = input_int();
printf("%d\n", n);
return 0;
}
int input_int(void)
{
int n = 0, c;
for (c = getchar(); c!='\n' && c!=EOF; c=getchar()) {
n *= 10;
n += c - '0';
}
return n;
}

练习 2:

只用 fgets 函数读入一个整数。假设它占据单独的一行,读到行末为止,包括换行符。输入保证读入的整数可以保存在 int 中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* ziqin 2014 */
#include <stdio.h>
int input_int(FILE * fp);
int main(void)
{
int n;
n = input_int(stdin);
printf("%d\n", n);
return 0;
}
int input_int(FILE * fp)
{
char buf[20];
int n = 0, i;
fgets(buf, 20, fp);
for (i = 0; buf[i] != '\n'; i++) {
n *= 10;
n += buf[i] - '0';
}
return n;
}

练习 3:

只用 getchar 实现 fgets 的功能,即用每次一个字符的方式读取整行。

注:未实现 fgets 的第 3 个参数,直接从标准输入读入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* ziqin 2014 */
#include <stdio.h>
void my_fgets(char * buf, int maxn);
int main(void)
{
char s[100];
my_fgets(s, 100);
printf("%s", s);
return 0;
}
void my_fgets(char * buf, int maxn)
{
int i = 0, c;
for (c=getchar(); c!='\n' && c!=EOF && i<(maxn-2); c=getchar())
buf[i++] = (char) c;
buf[i++] = '\n'; buf[i] = '\0'; // 字符串末尾
}

练习 4:

实现 strchr 的功能,即在一个字符串中查找一个字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
char * my_strchr(char * s, char c);
int main(void)
{
char string[] = "this is a string.\0";
char * cp = my_strchr(string, 'a');
if (cp == NULL)
printf("Not found!\n");
else
printf("%s\n", cp);
return 0;
}
char * my_strchr(char * s, char c)
{
char * cp = NULL;
int i;
// 视'\0'为字符串结束标志
for(i = 0; s[i] != '\0'; i++) if (s[i] == c) {
cp = &s[i];
break;
}
return cp;
}

练习 5:

实现 isalphaisdigit 的功能,即判断字符是否为字母/数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int my_isalpha(char c);
int my_isdigit(char c);
int main(void)
{
char c = 'w';
my_isalpha(c) ?
printf("%c is alpha.\n", c) :
printf("%c is not alpha.\n", c);
my_isdigit(c) ?
printf("%c is digit.\n", c) :
printf("%c is not digit.\n", c);
return 0;
}
int my_isalpha(char c)
{
return ('A'<=c && c<='Z')||('a'<=c && c<='z');
}
int my_isdigit(char c)
{
return '0'<=c && c<='9';
}