《C Primer Plus》编程练习—第15章

《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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值