两天时间,15道题,看上去简单,做一下就知道每道都要命,眼睛都要废了……
//answers of the questions in the Peimer at Chapter 11
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#define LINES 4
#define N 20
int main(int argc,char *argv[]) {
//1
/*
char chArr[N + 1];
void strCopyMy(char *chArr,int n);
strCopyMy(chArr, N);
puts(chArr);*/
//2
/*
char chArr[N + 1];
void strCopyMy_2(char *chArr, int n);
char temp;
strCopyMy_2(chArr, N);
puts(chArr);
*/
//3
/*第二题的程序适用
char chArr[N + 1];
void strCopyMy_2(char *chArr, int n);
char temp;
strCopyMy_2(chArr, N);
puts(chArr);
*/
//4
/*
char chArr[2*N];
char* strChMy(char *chArr, char ch);
char ch;
char *temp;
int i = 0;
printf("begin:\n");
while (i < 10) {
printf("please enter a line:\n");
gets(chArr);
printf("please enter a character:\n");
ch = getchar();
getchar();//除掉录入ch后的那一个\n
temp = strChMy(chArr, ch);
printf("%c\n", *temp);
puts(temp);
i++;
}*/
//5
/*
int is_within(char *chArr, char ch);
char chArr[] = "I am a wonderful person!";
char ch = 'k';
int position;
position = is_within(chArr, ch);
printf("%d\n", position);
*/
//6
/*
char* strncpyMy(char *str1, char* str2, int n);
char *str1[2 * N];
char *str2 = "this is a wonderful story!";
strncpyMy(str1, str2, 2 * N);
puts(str1);
*/
//7
/*
char *string_in(char* chArr1,char *chArr2);
char chArr1[] = "this is a wonderful story";
char chArr2[] = "wonderful";
char *same;
same = string_in(chArr1, chArr2);
puts(same);//以返回的指针处开始打印
*/
//8
/*
void reverseChArr(char *chArr);//attention this function can only receive a string less than 4*N letters.
char chArr1[] = "this is a wonderful story\n";
char chArr2[4 * N];
puts(chArr1);
reverseChArr(chArr1);
puts(chArr1);
*/
//9
/*
char chArr1[4 * N];
void deleteSpace(char *chArr);
gets(chArr1);
while (*chArr1 != ' ')
{
deleteSpace(chArr1);
puts(chArr1);
gets(chArr1);
}
*/
//10
/*
char chArr[LINES][N];
int choice;
void ASCIIOrder(char*chArr[], int lines);//按ASCII码排列
void FirstWordLengthOrder(char*chArr[][N], int lines);//按ASCII码排列
void LengthOrder(char*chArr[], int lengthArr[],int lines);//按串长排列
void showArray(char *chArr[], int lines);
char *head[LINES];
int lengthArr[LINES];
for (int i = 0; i < LINES; i++)
{
printf("please enter the %dth line:\n", i);
gets(chArr[i]);
head[i] = chArr[i];
*(lengthArr + i) = strlen(chArr[i]);
}
int flag = 1;
while (flag)
{
printf("Please choose your option:\n");
printf("1.output string:\n");
printf("2.print according to the ascII order:\n");
printf("3.print according to length:\n");
printf("4.print according to the length of the first word:\n");
printf("5.Quit:\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
showArray(head, LINES);
break;
case 2:
ASCIIOrder(head, LINES);
showArray(head, LINES);
break;
case 3:
LengthOrder(head, lengthArr, LINES);
showArray(head, LINES);
break;
case 4:
FirstWordLengthOrder(head, LINES);
showArray(head, LINES);
break;
case 5:
flag = 0;
break;
default:
break;
}
}
*/
//11
/*
char chArr[4 * N];
char temp;
int Upper = 0;
int Lower = 0;
int Punct = 0;
int Num = 0;
int total = 0;
int i = 0;
while ((temp = getchar()) != EOF)
{
if (temp >= 'A'&&temp <= 'Z')
{
Upper++;
}
else if (temp >= 'a'&&temp <= 'z')
{
Lower++;
}
else if (ispunct(temp))
{
Punct++;
}
else if (temp >= '0'&&temp <= '9')//判断数字也得用ASCII码!
{
Num++;
}
*(chArr + i) = temp;
i++;
}
*(chArr + N - 1) = '\0';
puts(chArr);
printf("\nthe number of upper letters is %d;\n", Upper);
printf("the number of lower letters is %d;\n", Lower);
printf("the number of Punct letters is %d;\n", Punct);
printf("the number of Num letters is %d;\n", Num);
*/
//12
//此题写的是相当不好!!!
//运行此程序需在cmd下运行,需几个参数(小于LINES)
/*
//const char *mytal[LINES] = { "adding name swiftly","multiply quickly","following instructions ","understand the C"};
char mytal[LINES][4 * N];
char *temp[LINES];
char *temp2[LINES];
void ReverseWord(char* chArr[],char *temp2[],int lines);
for (int i = 0; i < argc; i++)
{
strcpy(mytal[i], argv[i]);
}
for (int i = 0; i < LINES; i++)
{
temp[i] = mytal[i];
puts(temp[i]);
}
printf("**************\n");
ReverseWord(temp,temp2,LINES);
for (int i = 0; i < LINES; i++)
{
puts(temp2[i]);
}
*/
//13
//调用ctype.h中的函数strtod();
/*
double bottom;
int index;
double reNum;
bottom = atof(argv[1]);
index = atoi(argv[2]);
reNum = pow(bottom, index);
printf("the result is %lf", reNum);
*/
//14
/*
int AtoIMy(char *chArr[],int lines);
char chArr[2 * N] = "this is 123 huge456 news!";
int num;
num = AtoIMy(chArr, 2 * N);
puts(chArr);
printf("%d",num);
*/
//15
//本例亦需在cmd下运行,需参数-p或-u或-l
char *chArr[4 * N];
int choice = 0;
void ToUpperMy(char *chArr);
void ToLowerMy(char *chArr);
//printf("%s", argv[1]);
if (!strcmp(argv[1], "-p"))
{
choice = 0;
}
else if (!strcmp(argv[1], "-u"))
{
choice = 1;
}
else if (!strcmp(argv[1], "-l"))
{
choice = 2;
}
printf("your choice is : %d\n",choice);
printf("Please enter a line:\n");
gets(chArr);
switch (choice)
{
case 0:
puts(chArr);
break;
case 1:
ToUpperMy(chArr);
puts(chArr);
break;
case 2:
ToLowerMy(chArr);
puts(chArr);
break;
default:
break;
}
return 0;
}
void ToLowerMy(char *chArr) {
int i = 0;
while (*chArr) {
*chArr = tolower(*chArr);
chArr++;
}
}
void ToUpperMy(char *chArr) {
int i = 0;
while (*chArr) {
*chArr = toupper(*chArr);
chArr++;
}
}
int AtoIMy(char chArr[],int lines) {
int num = 0;
int counter=0;
int times10;
for (int i = 0; i < lines; i++)
{
if (chArr[i] >= '0'&&chArr[i] <= '9')
{
num = num * 10 + (int)(chArr[i]-'0');
counter++;
}
else if ((chArr[i] >= '9' || chArr[i] <= '0')&&counter != 0)//在进入数字后遇符号跳出
{
break;
}
}
return num;
}
void ReverseWord(char* chArr[], char *temp[], int lines) {
for (int i = 0; i < LINES; i++)
{
temp[i] = chArr[LINES - i-1];
}
}
void FirstWordLengthOrder(char *chArr[], int lines) {
void LengthOrder(char *chArr[], int lengthArr[], int lines);
int temp[LINES];
for (int i = 0; i < lines; i++)
{
for (int j = 0; j < N; j++)
{
if (*(*(chArr + i) + j) == ' '|| *(*(chArr + i) + j) == '\0')
{
*(temp + i) = j;
break;
}
}
}
LengthOrder(chArr, temp, lines);
}
void showArray(char *chArr[], int lines) {
for (int i = 0; i < lines; i++)
{
puts(chArr[i]);
}
}
void LengthOrder(char *chArr[], int lengthArr[], int lines) {
//按串长排列
int max;
char *temp;
int midNum;
for (int i = 0; i < lines - 1; i++)
{
max = *(lengthArr + i);
for (int j = i + 1; j < lines; j++)
{
if (max<*(lengthArr+j))
{
max = *(lengthArr + j);
//交换串长
midNum = *(lengthArr + j);
*(lengthArr + j) = *(lengthArr + i);
*(lengthArr + i) = midNum;
//交换地址
temp = *(chArr + j);
*(chArr + j) = *(chArr + i);
*(chArr + i) = temp;
}
}
}
}
void ASCIIOrder(char *head[],int lines) {
char *temp;
for (int i = 0; i < lines - 1; i++)
{
for (int j = i + 1; j < lines; j++)
{
if (strcmp(head[i], head[j]) > 0)
{
temp = head[i];
head[i] = head[j];
head[j] = temp;
}
}
}
}
void deleteSpace(char *chArr) {
int length;
length = strlen(chArr);
for (int i = 0; i < length; i++)
{
if (*(chArr + i) == ' ') {
for (int j = i; j < length; j++)
{
*(chArr + j) = *(chArr + j + 1);//向前提一个,一直到length+1=='\0'
}
}
}
}
void reverseChArr(char *chArr) {
int length;
int i = 0;
char copyArr[4 * N];
length = strlen(chArr);
strncpy(copyArr, chArr, length + 1);
while (*(copyArr+i)!='\0')
{
*(chArr + i) = *(copyArr + length - 1 - i);//reverse the sentence!
i++;
}
}
char *string_in(char* chArr1, char *chArr2) {
char *same = "\0";
int length1, length2;
length1 = strlen(chArr1);
length2 = strlen(chArr2);
if (length1 > length2) {
for (int i = 0; i < length1 - length2 + 1; i++) {
if (strncmp(chArr1+i, chArr2,length2) == 0)//仅截取length2长度以比较
{
same = chArr1 + i;
break;
}
}
}
return same;
}
char* strncpyMy(char *str1, char* str2, int n) {
for (int i = 0; i < n; i++)
{
if (*(str2 + i) != '\0') {//判断str2是否完结
*(str1 + i) = *(str2 + i);
}
else {
*(str1 + i) = '\0';
break;
}
}
return str1;
}
int is_within(char *chArr, char ch) {
int i = 0;
int flag = 0;
while (*(chArr + i) != '\0')
{
if (*(chArr + i) == ch) {
flag = i + 1;
break;
}
i = i++;
}
return flag;
}
char* strChMy(char *chArr,char ch) {
//找含第二个参数字符在第一个参数内第一次出现的指针
int i = 0;
char *temp = "";
while (*(chArr + i) != '\0')
{
if (*(chArr + i) == ch) {
temp = (chArr + i);
break;
}
i = i++;
}
return temp;
}
void strCopyMy_2(char *chArr, int n) {
char temp;
for (int i = 0; i < n; i++)
{
if ((temp = getchar())!= ' ' && temp!='\n' && temp!='\t')//判断是否为所避关键字
{
*(chArr + i) = temp;
}
else {//如果是特殊字符,立刻结尾,破出
chArr[i] = '\0';
break;
}
}
chArr[N] = '\0';//将最后一位给结束字符以免乱码!
}
void strCopyMy(char *chArr,int n) {
//fgets(chArr, n, stdin);//fgets更安全!
for (int i = 0; i < n; i++)
{
*(chArr + i) = getchar();
}
chArr[N] = '\0';//将最后一位给结束字符以免乱码!
}