一、编程实现字符串中各单词的反转
这种题目的思路通常就是先将每个单词中的字母倒置,然后再将整个字符串倒置。
#include <iostream> using namespace std; void change(char *str); int main(int argc, char **argv) { char src[] = "I am from Shanghai"; cout << src << endl; change(src); cout << src << endl; return 0; } void change(char *src) { char *start = src, *end = src, *ptr = src; while(*ptr++ != '\0') //遍历整个字符串 { if(*ptr == ' ' || *ptr == '\0') //找到一个单词 { end = ptr - 1; //end指向单词的末尾 while (start < end) { swap(*start, *end); //使用库函数将单词倒置 start++; end--; } start = end = ptr + 1; //指向下一个单词的开头 } } start = src, end = ptr - 2; //start指向字符串的起始位置, end指向字符串的末尾 while(start < end) { swap(*start++, *end--); //将整个字符串倒置 } }
二、编程判断字符串是不是回文
#include <iostream> #include <cstring> using namespace std; int func(char *str); int main(int argc, char **argv) { int ret; char str[10] = "level"; char str2[10] = "12345"; ret = func(str); if(ret == 1) cout << str << "是回文" << endl; else if(ret == 0) cout << str << "不是回文" << endl; else cout << "此字符串无效" << endl; return 0; } int func(char *str) { int flag = 1; //0不是回文,1表示回文 if(str == NULL) return -1; //-1表示这个字符串无效 int len = strlen(str); //计算字符串的长度 int i = 0; for(; i < (len /2); i++) { if(*(str + i) != *(str + len - i -1)) { flag = 0; break; } } return flag; }
我们只要比较一个字符串前面和后面对应位置的字符是不是相同,如果都相同,那么这个字符串就是回文,否则只要有一个对应的位置的字符不同,那么这个字符串就不是回文。
三、编程实现字符串比较
这道题就是让我们实现库函数中的strcmp函数。
#include <iostream> #include <cstring> using namespace std; int mystrcmp(const char *str1, const char *str2); int main(int argc, char **argv) { char str[10] = "hallo"; char str1[10] = "hallo"; char str2[10] = "hall"; char str3[10] = "hallob"; cout << mystrcmp(str, str1) << endl; cout << mystrcmp(str, str2) << endl; cout << mystrcmp(str, str3) << endl; return 0; } int mystrcmp(const char* str1, const char *str2) { int flag = 0; //0表示相同,1表示str1 > str2, -1 表示str1< str2; int len1 = strlen(str1); int len2 = strlen(str2); int len; if(len1 > len2) len = len1; else len = len2; int i; for(i = 0; i < len; i++) { if(*str1 < *str2) //只要有一个字符不同就将flag置为相应的值并且退出 { flag = -1; break; } else if(*str1 > *str2) //只要有一个字符就将flag置为相应的值并且退出 { flag = 1; break; } str1++; str2++; } return flag; }
四、编程查找两个字符串的最大公共子串
#include <iostream> #include <cstdlib> #include <cstring> using namespace std; char *commonstring(char *str1, char *str2) { int i, j; char *shortstr, *longstr; char *substr; if(NULL == str1 || NULL == str2) //判断这两个字符串的有效性 return NULL; if(strlen(str1) <= strlen(str2)) //将长的字符串赋值给longstr,短的字符串赋值给shortstr { shortstr = str1; longstr = str2; } else { shortstr = str2; longstr = str1; } if(strstr(longstr, shortstr) != NULL) //利用库函数在longstr中寻找短串shortstr, //如果找到了最大公共子串就是shortstr return shortstr; substr = new char[strlen(shortstr) + 1]; //给substr动态分配一个可以容纳shortstr的空间 for(i = strlen(shortstr)-1; i > 0; i--) { for(j = 0; j <= strlen(shortstr) - i; j++) { memcpy(substr, &shortstr[j], i); //将短字符的一部分复制到substr中, //然后和长串比较,看看长串中是否包含substr substr[i] = '\0'; if(strstr(longstr, substr) != NULL) return substr; } } return NULL; } int main(int argc, char **argv) { char *str1 = new char[256]; char *str2 = new char[256]; char *common = NULL; cin.getline(str1, 256); cin.getline(str2, 256); common = commonstring(str2, str1); cout << common << endl; return 0; }
【注意】:因为是找最大的公共子串,所以应该先看看,短串是不是长串的公共子串,如果是,就直接返回这个端串。如果不是,那么我们就要先从短串中开始遍历,看看短串的一部分是不是长串的子串,注意,这里我们也是从短串中取出最长的一部分赋值给substr,判断是不是长串的子串,然后依次减小substr的长度,进行比较。