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;
}