c和指针第9章编程练习答案

17这道题建议多用几个数试试 没有那种测试软件我也不知道出现什么情况程序会输出不对,书的图看不懂就自己一步步弄出来的,有问题告知.

第1题

EOF为键盘上ctrl加z为结束符

#include<stdio.h>
#include<ctype.h>
int main(void) {
	int ch;
	int UIControls =0;
	int blank = 0;
	int num = 0;
	int letters = 0;
	int Capital = 0;
	int punctuation = 0;
	int charactersfor=0;
	while ((ch = getchar()) !=EOF ) {
		if (iscntrl(ch))
			UIControls++;
		else if (isspace(ch))
			blank++;
		else if (isdigit(ch))
			num++;
		else if (islower(ch))
			letters++;
		else if (isupper(ch))
			Capital++;
		else if (ispunct(ch))
			punctuation++;
		else if (isprint(ch)) {
			charactersfor++;
		}
	}
	printf("控制字符:%d\n", UIControls);
	printf("空白字符:%d\n", blank);
	printf("数字:%d\n", num);
	printf("小写字母:%d\n", letters);
	printf("大写字母:%d\n", Capital);
	printf("标点符号:%d\n", punctuation);
	printf("不可打印字符:%d\n", charactersfor);

	return 0;
}

第2题

#include<stdio.h>
#include<stddef.h>
size_t my_strlen(char* str, int n) {
	int count=0;
	while (*str++ != '\0' && n-- > 0) {
		count+=1;
	}
	return count;
}

第3题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void my_strcpy(char* str1,const char* str2,const int count) {/*第三个参数为第一个参数的大小*/
	int v = strlen(str2);
	int k = strlen(str1);
	int j = 0;
	if (str2[v] != '\0'||k+1>=count)/*字符串是以‘\0’为结束标志如果不是就不是字符串*/
		exit(EXIT_FAILURE);
	while (j < count && str2[j] != '\0') {
		str1[j] = str2[j];
		j++;
	}
	if (j < count)
		str1[j] = '\0';
	else
		str1[j - 1] = '\0';
}
my_strcpy(str, "helloyai",sizeof(str));

第4题

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void my_strcat(char* str1,const char* str2,const int size_c,const int size_t) {/*第三个参数为参数一的长度(你分配字节的长度)参数四为你参数2的长度*/
	int g = strlen(str1);
	int i = 0;
	if (g+1 >= size_c || str2[size_t-1]!='\0') {/*表示数组内容已满  和参数2是不是字符串*/
		printf("Error");
		exit(EXIT_FAILURE);
	}
	while (g < size_c && str2[i] != '\0') {
		str1[g] = str2[i];
		g++;
		i++;
	}
	if (g == size_c)
		str1[g - 1] = '\0';
	else
		str1[g] = '\0';
	return;
}
my_strcat(str,str2,sizeof(str),sizeof(str2));

第5题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void my_strncat(char* dest, char* src, int dest_len) {
	int g = strlen(dest);
	int i = 0;
	if (g+1 >= dest_len) {/*表示原数组内容已满*/
		puts("Error");
		exit(EXIT_FAILURE);
	}
	while (g < dest_len && src[i] != '\0') {
		dest[g++] = src[i++];
	}
	if (g >= dest_len)
		dest[--g] = '\0';
	else
		dest[g] = '\0';
}

第6题

#include<stdio.h>
#include<string.h>
char* my_strcpy_end(char * str1, char *str2) {
	while (*str2 != '\0') {
		*str1++ = *str2++;
	}
	*str1 = '\0';
	return str1;
}

第7题

#include<stdio.h>
#include<string.h>
char* my_strrchr(char const* str, int ch) {
	char* p=str;
	char* q=NULL;
	while (*p) {
		p=strchr(p, ch);
		if (p)
			q = p;
		else break;
		p++;
	}
	return q;
}

第8题

#include<stdio.h>
#include<string.h>
char* my_strnchr(char const* str, int ch, int witch) {
	int i = 1;
	char* p=str;
	char* q =NULL;
	while (i++ <= witch&&p!='\0') {
		p = strchr(p, ch);
		q = p;
		p++;
	}
	return q;
}

第9题

#include<stdio.h>
#include<string.h>
int count_chars(char const* str, char const* chars) {
	int i = 0;
	char* p=str;
	char* q = chars;
	while (*q != '\0') {
		if (strchr(p, *q++))
			i++;
	}
	return i;
}

第10题

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int palindrome(char* string) {
	int i = strlen(string)-1;
	char* q;
	q = string;
	while (*string != '\0') {
		if (tolower(*string) == tolower(q[i--])&&isalpha(*string)) {
			string++;
		}
		else return 0;
	}
	return 1;
}

第11题

#include<stdio.h>
#include<ctype.h>
#include<string.h>
int Counint(char* str) {
	int i = 0;
	char* p=strstr(str,"the");
	while (p) {
		i++;
		p++;
		p = strstr(p, "the");
	}
	return i;
}

第12题

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int prepare_key(char* key) {
	int i = 0;
	int size = strlen(key);
	int h;
	for (i = 0; i < size;) {
		if (isalpha(key[i]))/*非字母字符*/
			i++;
		else return 0;
	}
	for (i = 0; i <size; i++) {
		key[i] = toupper(key[i]);/*转换大写*/
	}
	for(i=0;i<size+1;i++){
		for (int j = i + 1; j < size + 1; j++) {
			if(key[i]==key[j])
				for (int k = j; k < size + 1; k++) {
					key[k] = key[k + 1]; 
				}
		}
	}
	h = strlen(key);
	for (int k = 'A'; k < 'Z'; k++) {
		if (strchr(key, k) == NULL)
			key[h++] = k;
	}
	key[h] = '\0';
	return 1;
}

第13题

#include<stdio.h>
#include<ctype.h>
void encrypt(char* data, char const* key) {
	while (*data != '\0') {
		if (isalpha(*data)) {
			if (islower(*data))
				*data = *(key + (*data - 'a'));
			else
				*data = *(key + (*data - 'A'));
		}
		data++;
	}
	return;
}
int prepare_key(char* key) {
	int i = 0;
	int size = strlen(key);
	int h;
	for (i = 0; i < size;) {
		if (isalpha(key[i]))/*非字母字符*/
			i++;
		else return 0;
	}
	for (i = 0; i < size; i++) {
		key[i] = toupper(key[i]);/*转换大写*/
	}
	for (i = 0; i < size + 1; i++) {
		for (int j = i + 1; j < size + 1; j++) {
			if (key[i] == key[j])
				for (int k = j; k < size + 1; k++) {
					key[k] = key[k + 1];
				}
		}
	}
	h = strlen(key);
	for (int k = 'A'; k < 'Z'; k++) {
		if (strchr(key, k) == NULL)
			key[h++] = k;
	}
	key[h] = '\0';
	return 1;
}

第14题

#include<stdio.h>
#include<ctype.h>
#include<string.h>
void decrypt(char* data, const char* key)
{
	int i;
	while (*data != '\0') {
		if (isalpha(*data)) {
			for (i = 0; key[i] != *data; i++);
			if (islower(*data)) {
					*data = 'a' + i;
			}
			else {
					*data = 'A' + i;
			}
		}
		data++;
	}
}
void encrypt(char* data, char const* key) {
	while (*data != '\0') {
		if (isalpha(*data)) {
			if (islower(*data)) {
				*data = key[*data - 'a'];
			}
			else
				*data =key[*data - 'A'];
		}
		data++;
	}
	return;
}
int prepare_key(char* key) {
	int i = 0;
	int size = strlen(key);
	int h;
	for (i = 0; i < size;) {
		if (isalpha(key[i]))/*非字母字符*/
			i++;
		else return 0;
	}
	for (i = 0; i < size; i++) {
		key[i] = toupper(key[i]);/*转换大写*/
	}
	for (i = 0; i < size + 1; i++) {
		for (int j = i + 1; j < size + 1; j++) {
			if (key[i] == key[j])
				for (int k = j; k < size + 1; k++) {
					key[k] = key[k + 1];
				}
		}
	}
	h = strlen(key);
	for (int k = 'A'; k < 'Z'; k++) {
		if (strchr(key, k) == NULL)
			key[h++] = k;
	}
	key[h] = '\0';
	return 1;
}

下面几个题我会把全部函数发出来

第15题

#include<stdio.h>
#include<string.h>
void dollars(char* dest, char const* src) {
	int len = strlen(src);
	int i = len - 3, j = 0;
	*dest = '$';
	dest++;
	if (*(src + len) != '\0')/*保证字符串是NUL结尾*/
		return;
	if (len > 2) {
		while (i >= 0) {
			*dest++ = *src;
			if (i % 3 == 0 && i != 0)
				*dest++ = ',';
			i--;
			src++;
		}
		*dest++ = '.';
		while (*src != '\0') {
			*dest++ = *src++;
		}
		*dest = '\0';
	}
	else {
		*dest++ = '0';
		*dest++ = '.';
		if (len - 1 == 0) {
			*dest++ = '0';
			*dest++ = *(src + len - 1);
			*dest = '\0';
		}
		else {
			*(dest + len) = '\0';
			while (len > 0) {
				*(dest + len-1) = *(src + len - 1);
				len--;
			}
		}
	}
}
int main(char *argv[], int argc) {
	char src[50] = "123456";
	char dest[50];
	dollars(dest, src);
	puts(dest);
	return 0;
}

第16题

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int format(char* format_string, char const* digit_string) {
	int i = strlen(digit_string) - 1;
	int j = strlen(format_string) - 1;
	int m = 0;
	if (i < 0)
		return 0;
	while (j >= 0) {
		switch (*(format_string + j)) {
		case '#':
			if (i >= 0) {
				*(format_string + j) = *(digit_string + i);
			}
			else if (j >= 0) {
				*(format_string + j) = ' ';
			}
			break;
		case ',':
			if (j == 0) {
				*(format_string + j) = ' ';
			}
			else if (j != 0 && i < 0)
				*(format_string + j) = ' ';
			else if (j != 0 && i >= 0)
				i++;
			else if (i < 0)
				*(format_string + j) = ' ';
			break;
		case '.':
			m = j + 1;//6
			while (*(format_string + m) == ' ')/*查看前面是否有空白字符将空白字符变为0*/ {
				*(format_string + m++) = '0';
			}
				if (i < 0) {
					*(format_string + j - 1) = '0';
					j -= 1;
				}
				else if (i >= 0) {
					j -= 1;//4
					*(format_string + j) = *(digit_string + i);//5
				}
			break;
		}
		j -= 1, i -= 1;//6 5 4 4 3 3 2 2 0 1
	}
	if (*(format_string) == *digit_string || *format_string == ' ')
		return 1;
	else return 0;
}
int main(void) {
	char format_string[50]="#,###.##";
	char digit_string[50]="1234567";
	printf("%d\n", format(format_string, digit_string));
	puts(format_string);
	return 0;
}

第17题

include<stdio.h>
#include<ctype.h>
/*不要专牛角尖比如 ,##*/
char* edit(char* pattern, char const* digits) {
	int ch = *pattern;
	int* p = NULL;
	char* q = NULL;
	if (*digits == '\0' && *pattern != '\0') {/*这里我没有做pattern是否能容下*/
		*(pattern += 1) = ch;
		*(pattern + 1) = '\0';//将后面多余全部删除
	}
	if (*pattern == '\0')
		return NULL;
	pattern += 1;
	while (*digits == '0' || *digits == ' ') {
		if (*(pattern) == '#')
			*pattern = ch;
		if (*(pattern + 1) == ',')/*查看下一个字符是否为逗号*/
			*(pattern += 1) = ch;
		else if (*(pattern) == '.') {
			p = pattern;/*记录*/
			*(pattern += 1) = ch;
		}
		else if (*pattern != '#')/*不是逗号不是点那么就是其他字符*/
			*pattern = ch;
		digits++, pattern++;
	}
	q = pattern;/*直接指向有效数字*/
	if (*digits == '\0')/*如果digits在上面循环到最后直接将模式字符串多余字符删除*/
		*pattern = '\0';
	if (p != NULL)/*回到点*/
		pattern = p;
	while (*(pattern) != '\0') {

		if (*pattern == ',' || *pattern == '.') { /*将模型里面后面的其他字符全部转换*/
		}
		else
			*pattern = '#';

		switch (*(pattern)) {
		case '#':
			if (*digits == ' ')
				*pattern = '0';
			else if (*digits != '\0')
				*pattern = *digits;
			break;

		case ',':
			digits--; break;
		case '.':
			if (*(pattern - 1) == ch)/*查看左边是否等ch*/
				*(pattern - 1) = '0';
			while (*(pattern + 1) == ch)/*查看右边是否为ch*/
				*(pattern += 1) = '0';
			if (*digits != '\0')
				digits--;
			break;
		}
		if (*digits == '\0')
			*pattern = '\0';
		if (*digits != '\0')
			digits++;
		pattern++;
	}
	return q;
}
int main(void) {
	char pattern[50]="$#,##!.##";
	char digits[50]="123  ";
	printf("%s\n", edit(pattern, digits));
	puts(pattern);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值