目录
//逆序字符串中的单词
思路:先将整个字符串逆序,再分别将每个单词逆序。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
将句中单词颠倒顺序输出
void reverse(char* left, char* right)
{
assert(left && right);//断言指针有效性,确保其不为空指针
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[100];
printf("请输入一个字符串:");
gets(arr);
int len = strlen(arr);
//逆序整个字符串
reverse(arr, arr + len - 1);
//分别逆序每个单词
char* end = arr;
while (*end)
{
char* begin = end;//重点!!
while (*end != ' ' && *end != '\0')
{
end++;
}
reverse(begin, end - 1);
if (*end != '\0')//如果到达'\0'而不是' ',直接结束循环
end++;
}
//打印字符串
printf("逆序后的字符串为:%s\n", arr);
return 0;
}
//左旋字符串
法一:一个字符一个字符地换
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
int i, j, k, n, len;
char arr[10];
printf("请输入字符串:");
gets(arr);
printf("请问您想左旋几个字符?:");
scanf("%d", &k);
len = strlen(arr);
k = k % len;//预防重复,如abcdef,左旋8次即为左旋2次
printf("左旋后的字符串为:");
for (i = 0; i < k; i++)//旋转k次,一次一个字符
{
//1.拿出首元素
char tmp = arr[0];
//2.将后面所有元素向前移一位
for (j = 0; j < len - 1; j++)
{
arr[j] = arr[j + 1];
}
//3.将首元素放在最后
arr[len - 1] = tmp;
}
puts(arr);
return 0;
}
法二:分别先逆序左右字符串,再逆序整体
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left, char* right)
{
assert(left);//断言指针有效性
assert(right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
int i, j, k, n, len;
char arr[10];
printf("请输入字符串:");
gets(arr);
printf("请问您想左旋几个字符?:");
scanf("%d", &k);
len = strlen(arr);
k = k % len;
//逆序左
reverse(arr, arr + k - 1);
//逆序右
reverse(arr + k, arr + len - 1);
//逆序整体
reverse(arr, arr + len - 1);
printf("左旋后的字符串为:");
puts(arr);
return 0;
}
//判断两个字符串是否为左旋关系
法一:一个字符一个字符地旋转,逐个判断是否相等
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//左旋字符
void left_move(char arr[], int n, int sz)
{
int i, j;
for (i = 0; i < n; i++)
{
char tmp = arr[0];
for (j = 0; j < sz - 1; j++)
{
arr[j] = arr[j + 1];
}
arr[sz - 1] = tmp;
}
}
//判断是否
int is_left_move(char arr1[], char arr2[])
{
int len1 = strlen(arr1);
int len2 = strlen(arr2);
if (len1 != len2)//长度都不一样,肯定是NO
{
return 0;
}
else
{
for (int i = 0; i < len1; i++)
{
left_move(arr1, 1, len1);//每次将arr1左旋一个字符
if (strcmp(arr1, arr2) == 0)//再与arr2比较
{
return 1;
}
}
return 0;
}
}
int main()
{
char arr1[10], arr2[10];
printf("请输入arr1:");
gets(arr1);
printf("请输入arr2:");
gets(arr2);
int ret = is_left_move(arr1, arr2);
printf("arr1是否是arr2左旋后的字符串?:");
if (ret == 0)
{
printf("NO\n");
}
if (ret == 1)
{
printf("YES\n");
}
return 0;
}
法二:使用 strncat 和 strstr
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int is_left_move(char arr1[], char arr2[])
{
int len1 = strlen(arr1);
int len2 = strlen(arr2);
if (len1 != len2)
{
return 0;
}
else
{
strncat(arr1, arr1, len1);//将arr1后复制len1个字符的arr1
if (strstr(arr1, arr2) != NULL)//判断arr2是否为arr1的子字符串
{ //若是,返回arr1中第一个子字符串的起始位置
return 1; //若不是,返回空指针NULL
}
else
{
return 0;
}
}
}
int main()
{
char arr1[20], arr2[10];
printf("请输入arr1:");
gets(arr1);
printf("请输入arr2:");
gets(arr2);
printf("arr1是否是arr2左旋后的字符串?:");
int ret = is_left_move(arr1, arr2);
if (ret == 0)
{
printf("NO\n");
}
if (ret == 1)
{
printf("YES\n");
}
return 0;
}
这篇博客有点粗糙,害,学到知识就可以了嘛……是吧哈哈……(绝不承认是我偷懒!!)