目录
《C Primer Plus》编程练习
第15章
1.exercise1.c
编写一个函数,把二进制字符串转换为一个数值。例如,有下面的语句:
char * pbin = “01001001”;
那么把pbin作为参数传递给该函数后,它应该返回一个int类型的值73。
//exercise15.1
#include <stdio.h> //提供CHAR_BIT的定义,表示每字节的位数,在这是8位
#include <limits.h>
#include <string.h>
int btoi(const char *st);
char * s_gets(char *st, int n);
int check(const char *st);
int main(void)
{
const size_t LEN = CHAR_BIT * sizeof(int) + 1;
char bin_str[LEN];//存储二进制数,最多33位
puts("请输入二进制数:");
while (s_gets(bin_str, LEN) && bin_str[0] != '\0')//输入的第一个字母不是回车就循环
{
if (check(bin_str) == 0)//检查输入的二进制数不正确
{
puts("输入的不是二进制数,请重新输入:");
}
else
{
printf("二进制数%s的值是%d。\n", bin_str, btoi(bin_str));
puts("输入下一个二进制数:");
}
}
puts("程序结束。");
return 0;
}
int btoi(const char *st)//二进制数得到十进制数值
{
int length;
int i;
int total = 0;
length = strlen(st);//字符串长度
for (i = 0; i < length; i++)//从左往右读取数字
{
total = total * 2 + (st[i] - '0');//字符转成数字
}
return total;
}
char * s_gets(char *st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);//获取n个字符输入
if (ret_val)
{
find = strchr(st, '\n');//在st中找换行符
if (find)//找到了,说明长度没超过数组最大范围
{
*find = '\0';//截取
}
else
{
while (getchar() != '\n')
{
continue;
}
}
}
return ret_val;
}
int check(const char *st)//判断字符数组是否都是0,1
{
int is_bin = 1;//标记
while (is_bin && *st != '\0')//标记为1,且指针没到数组末尾
{
if (*st != '0' && *st != '1')//数组的元素不为字符0’且不为字符1’
{
is_bin = 0;//标记置为0,说明字符数组不是二进制数
}
st++;
}
return is_bin;
}
输出示例:
请输入二进制数:
01001001
二进制数01001001的值是73。
输入下一个二进制数:
程序结束。
2.exercise2.c
编写一个程序,通过命令行参数读取两个二进制字符串,对这两个二进制数使用~运算符、&运算符、|运算符和^运算符,并以二进制字符串形式打印结果(如果无法使用命令行环境,可以通过交互式让程序读取字符串)。
//exercise15.2
#include <stdio.h> //提供CHAR_BIT的定义,表示每字节的位数,在这是8位
#include <string.h>
#include <limits.h>
char * s_gets(char * st, int n);
int check(const char * st);
int btoi(const char * st);
char * itob(char * st, int n);
int main(void)
{
const size_t LEN = CHAR_BIT * sizeof(int) + 1;//字符数组最大长度33,最后一个是空字符
char input1[LEN];//第一个二进制字符串
char input2[LEN];//第二个二进制字符串
char temp[LEN];//临时数组
int num1;//第一个字符串的十进制值
int num2;//第二个字符串的十进制值
puts("请输入第一个二进制字符串:");
while (s_gets(input1, LEN) && check(input1) == 0)
{
puts("请输入一个二进制字符串:");
}
puts("请输入第二个二进制字符串:");
while (s_gets(input2, LEN) && check(input2) == 0)
{
puts("请输入一个二进制字符串:");
}
num1 = btoi(input1);
num2 = btoi(input2);
printf("~%s = %s\n", input1