0618,0619 ,指针,指针与数组,字符串

2024-06-20 06:44

本文主要是介绍0618,0619 ,指针,指针与数组,字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

第八章(指针),第九章(指针和数组),第十章(字符串)思维导图

作业1  逆序打印

解答:

答案:

作业2  判断回文

解答:

答案:

作业3  比较单词

解答:

答案:

619作业1:搜索字符串末尾

解答:

答案:

 619作业2:自己版本的 strlen

解答:

619作业3:自己版本的 strcpy

解答:

619作业4:自己版本的 strcat

解答:

619作业5:自己版本的 strcmp

解答:

作业1  逆序打印

(a) 编写程序读一条消息,然后逆序打印这条消息:

Enter a message: Don't get mad, get even.
Reversal is: .neve teg ,dam teg t'noD

提示:一次读取消息中的一个字符(用getchar函数),并且把这些字母存储在数组中,当数组满了或者读到字符 '\n' 时停止读操作。

(b) 修改上述程序,用指针代替整数来跟踪数组的当前位置。

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAX_NUM 1000void read_char(char* str, int len) {char c; int i = 0;while ((c = getchar()) != '\n') {str[i++] = c;}str[i] = '\0';
}void re_print(char* str, int len) {int i = 0;for (i = 0; str[i]; i++);i--;for (; i != 0; i--) {putchar(str[i]);}putchar(str[i]);putchar('\n');
}void re_print02(char* str, int len) {char* p = str;while (*p++);p--; p--;while ( p != str) {putchar(*p--);}putchar(*p);putchar('\n');
}int main(void) {char str[MAX_NUM];printf("Enter a message: ");read_char(str, MAX_NUM);printf("Reversal is: ");re_print(str, MAX_NUM);re_print02(str, MAX_NUM);return 0;
}

答案:

不是使用函数,录入的指针P可以直接使用逆序输出
(n < MAXLINE && (c = getchar()) != '\n'       必须检查数组是否越界,顺序不能改变(逻辑)

(a)#include <stdio.h>#define MAXLINE 128int main(void) {printf("Enter a message: ");char message[MAXLINE];int n = 0;char c;while (n < MAXLINE && (c = getchar()) != '\n') {message[n] = c;n++;}   // n == MAXLINE || c == '\n'printf("Reversal is: ");for (int i = n - 1; i >= 0; i--) {putchar(message[i]);}putchar('\n');return 0;
}
(b)#include <stdio.h>#define MAXLINE 128int main(void) {printf("Enter a message: ");char message[MAXLINE];char* p = message;char c;while (p < message + MAXLINE && (c = getchar()) != '\n') {*p++ = c;}   // p == message + MAXLINE || c == '\n'// p 指向最后一个字符后面printf("Reversal is: ");p--;while (p >= message) {putchar(*p--);}putchar('\n');return 0;
}

作业2  判断回文

(a) 编写程序读一条消息,然后检查这条消息是否是回文(消息从左往右看和从右往左看是一样的):

Enter a message: He lived as a devil, eh?
PalindromeEnter a message: Madam, I am Adam.
Not a palindrome

忽略所有不是字母的字符。用索引来跟踪数组中的位置。

(b)修改上述程序,使用指针代替索引来跟踪数组中的位置。

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#define MAX_NUM 1000//首字母大小写不限,单词断句是一样的,符号对比忽略
void read_char(char* str, int len) {char c; char *p1 = str; bool blank=true;//忽略字母前面的空白字符while ((c = getchar()) == ' ');*p1++ = c;while ((c = getchar()) != '\n') {//符号处理if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {   //字母判断!可恶!*p1++ = c;blank = true;}else if (blank) {*p1++ = ' ';blank = false;}}//最后一个字符不要存空格*p1--;*p1 = '\0';}bool judge01(char* str, int len) {}bool judge02(char* str, int len) {char* p = str;while (*p++);p--; p--;//定位到末尾  两个!!!char* p1 = str;//排除首字母大写/*putchar(*p);putchar(*p1);*/if ((*p - *p1) == ('z' - 'Z')|| *p == *p1) {p--; p1++;}else {return false;}while ((p != p1) && ((*p--) == (*p1++)))  //指针往中间移动,且比较元素;//退出条件,指针相等或者者元素不相等if (p-p1<=1) {return true;}else {return false;}
}int main(void) {char str[MAX_NUM];char re_str[MAX_NUM];printf("Enter a message: ");read_char(str, MAX_NUM);printf("%s\n", str);judge01(str, MAX_NUM) ? printf("Palindrome\n") : printf("Not a palindrome\n");judge02(str, MAX_NUM)? printf("Palindrome\n") : printf("Not a palindrome\n");return 0;
}

答案:

答案思路——完全输入——比较(只比较字母)

 while (i < j && !isalpha(message[i]))       isalpha,标准库函数,是否是字母

 if (tolower(message[i]) != tolower(message[j])) return false;        tolower,toupper标准库函数,转换成小写字母

(a)#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>#define MAXLINE 128bool is_palindrome(char message[], int n) {int i = 0, j = n - 1;while (i < j) {while (i < j && !isalpha(message[i])) {i++;}   // i == j || message[i] is a alphabetwhile (i < j && !isalpha(message[j])) {j--;}   // i == j || message[j] is a alphabetif (tolower(message[i]) != tolower(message[j])) return false;i++;j--;}return true;
}int main(void) {printf("Enter a message: ");char message[MAXLINE];int n = 0;char c;while (n < MAXLINE && (c = getchar()) != '\n') {message[n] = c;n++;}   // n == MAXLINE || c == '\n'if (is_palindrome(message, n)) {printf("Palindrome\n");} else {printf("Not a palindrome\n");}return 0;
}
(b)#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>#define MAXLINE 128bool is_palindrome(char* start, char* end) {while (start < end) {while (start < end && !isalpha(*start)) {start++;}   // i == j || message[i] is a alphabetwhile (start < end && !isalpha(*end)) {end--;}   // i == j || message[j] is a alphabetif (tolower(*start) != tolower(*end)) return false;start++;end--;}return true;
}int main(void) {printf("Enter a message: ");char message[MAXLINE];char* p = message;char c;while (p < message + MAXLINE && (c = getchar()) != '\n') {*p++ = c;}   // p == message + MAXLINE || c == '\n'// p 指向最后一个字符后面if (is_palindrome(message, p - 1)) {printf("Palindrome\n");} else {printf("Not a palindrome\n");}return 0;
}

作业3  比较单词

编写程序找出一组单词中最小单词和最大单词。当用户输入4个字母的单词时,程序停止读入。假设所有单词都不超过20个字母。程序会话如下:

Enter word: dog
Enter word: zebra
Enter word: rabbit
Enter word: catfish
Enter word: walrus
Enter word: cat
Enter word: fish

Smallest word: cat
Largest word: zebra
提示:使用两个名为 smallest_word 和 largest_word 的字符串来分别记录最小单词和最大单词。
用户每输入一个新单词,都要用 strcmp 把它与 smallest_word 和 largest_word 进行比较。
用 strlen 函数判断用户是否输入了 4 个字母的单词。

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define MAX_NUM 21int main(void) {char blank[MAX_NUM] = "";char arr[MAX_NUM];char max[MAX_NUM]="";char min[MAX_NUM]="";char c; char* p ; bool first = true;while (1) {printf("Enter word: ");p = arr;//初始化pstrcpy(arr, blank);while ((c = getchar()) == ' ');*p++ = c;while ((c = getchar()) != '\n') {*p++ = c;}*p = '\0';if (strlen(arr) == 4) {break;}if (first) {strcpy(max, arr);strcpy(min, arr);first = false;}if(strcmp(arr,max)>0){strcpy(max, arr);}else if (strcmp(arr, min)<0) {strcpy(min, blank);strcpy(min, arr);}}printf("Largest word: %s\n", max);printf("Smallest word: %s\n", min);return 0;
}

答案:

字符串读写,不要用getchar 和 putchar了

scanf("%s",word)  的匹配规则

忽略前置空白字符,读取字符,填入字符数组,遇到空白字符结束——适合空白字符分割的单词读入

不检查数组越界,记得检查

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>#define MAXWORD 21int main(void) {char smallest_word[MAXWORD];	char largest_word[MAXWORD];char word[MAXWORD];// 用第一个单词初始化 smallest_word 和 largest_wordprintf("Enter word: ");scanf("%s", word);strcpy(smallest_word, word);strcpy(largest_word, word);while (strlen(word) != 4) {printf("Enter word: ");scanf("%s", word);if (strcmp(word, smallest_word) < 0) {strcpy(smallest_word, word);} else if (strcmp(word, largest_word) > 0) {strcpy(largest_word, word);}};printf("\nSmallest word: %s\n", smallest_word);printf("Largest word: %s\n", largest_word);return 0;
}

619作业1:搜索字符串末尾

编写下面的函数:

void remove_filename(char* url);

url 指向一个包含以文件名结尾的 URL 字符串,例如 "http://www.knking.com/index.html"。函数需要移除文件名和前面的斜杠。(在上面的例子中,结果为 "http://www.knking.com")。要求在函数中使用 "搜索字符串末尾" 的惯用法。

提示:把字符串中的最后一个斜杠替换为空字符。

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100void remove_filename(char* url) {fgets(url, MAXNUM, stdin);char* p = url;int count = 0;while (count != 3 && p < url + MAXNUM && *p) {if (*p == '/') {count++;}p++;}//break  *p=='/'p--;*p = '\0';puts(url);
}
int main(void) {char str[MAXNUM] = "";remove_filename(str);return 0;
}

答案:

多种情况下,是找到最后一个P,而不是限制第三个
也不需要计数,每次*URL==‘/’的时候,用指针P记录地址,遍历完整之后,指针P记录的就是最后一个‘/’的地址,修改成‘\0'

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>void remove_filename(char* url) {char* p = url;// 搜索最后一个 '/'while (*url) {if (*url == '/') {p = url;}url++;}if (*p == '/') {*p = '\0';}
}int main(void) {char url[] = "http://www.knking.com/index.html";remove_filename(url);puts(url);return 0;
}

 619作业2:自己版本的 strlen

size_t my_strlen(const char* s);

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100size_t my_strlen(const char* s) {char* p = s; size_t num = 0;while (*p) {num++;p++;}return num;
}int main(void) {char s[] = "i love xixi";printf("my_strlen is % d\n",my_strlen(s));printf("strlen is % d\n", strlen(s));return 0;
}

619作业3:自己版本的 strcpy

char* my_strcpy(char* s1, const char* s2);

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100char* my_strcpy(char* s1, const char* s2) {char* p1 = s1;char* p2 = s2;while (*p1++ = *p2++);return s1;
}
int main(void) {char s[MAXNUM] = "i love xixi";char s2[MAXNUM] = "";char s3[MAXNUM] = "";my_strcpy(s2, s);strcpy(s3, s);puts(s2); puts(s3);return 0;
}

619作业4:自己版本的 strcat

char* my_strcat(char* s1, const char* s2);

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100char* my_strcat(char* s1, const char* s2) {int* p = s1;int* p1 = s2;while (*p) {p++;}while (*p++ = *p1++);*p = '\0';return s1;
}int main(void) {char s[MAXNUM] = " i love xixi";char s1[MAXNUM] = "i love panpan ";char s2[MAXNUM] = "huasheng and";my_strcat(s2, s); //huasheng and i love xixistrcat(s1, s);    //i love panpan i love xixiputs(s2); puts(s1);return 0;
}

619作业5:自己版本的 strcmp

int my_strcmp(const char* s1, const char* s2);

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100int my_strcmp(const char* s1, const char* s2) {char* p = s1; char* p1 = s2;while (*p++ == *p1++);return *(p--) - *(p1--);
}int main(void) {char s[MAXNUM] = "i love xixi";char s1[MAXNUM] = "i love panpan ";my_strcmp(s, s1) > 0 ? printf("i love xixi is big\n") : printf("i love panpan is big\n");strcmp(s, s1) > 0 ? printf("i love xixi is big\n") : printf("i love panpan is big\n");return 0;
}

这篇关于0618,0619 ,指针,指针与数组,字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077394

相关文章

2390.从字符串中移除星号

给你一个包含若干星号 * 的字符串 s 。 在一步操作中,你可以: 选中 s 中的一个星号。 移除星号左侧最近的那个非星号字符,并移除该星号自身。 返回移除 所有 星号之后的字符串。 注意: 生成的输入保证总是可以执行题面中描述的操作。 可以证明结果字符串是唯一的。 示例 1: 输入:s = “leet**cod*e” 输出:“lecoe” 解释:从左到右执行移除操作: 距离第 1 个

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级

剑指offer(C++)--左旋转字符串

题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! class Solution {public:string LeftRotateStri

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

PAT-1039 到底买不买(20)(字符串的使用)

题目描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以

利用结构体作为函数参数时结构体指针的定义

在利用结构体作为函数的参数进行传递时,容易犯的一个错误是将一个野指针传给函数导致错误。 #include <stdio.h>#include <math.h>#include <malloc.h>#define MAXSIZE 10typedef struct {int r[MAXSIZE]; //用于存储要排序的数组,r[0]作为哨兵或者临时变量int length;

js小题:通过字符串执行同名变量怎么做

在JavaScript中,你不能直接使用一个字符串来直接引用一个变量,因为JavaScript是一种静态类型语言(尽管它的类型在运行时可以变化),变量的名字在编译时就被确定了。但是,有几种方法可以实现类似的功能: 使用对象(或Map)来存储变量: 你可以使用一个对象来存储你的变量,然后使用字符串作为键来访问这些变量。 let myVars = { 'var1': 'Hello', 'var

IOS 数组去重的几种方式

本来只知道NSSet和KeyValues的。今天又新学了几种方式 还有就是和同事学的一种方式 外层循环从0开始遍历,内层从最后一个元素开始遍历 for(int i=0;i<index;i++){  for(int j=index-1;j>i;j-- ){ } }

isa指针的理解

D3实例isa指向D3类对象。D3类的话isa指向D3元类对象。D3元类保存类中的方法调度列表,包括类方法和对象方法