2021-08-10字符指针

简介: 2021-08-10字符指针

1.字符串左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

分析:我们先考虑左旋一个字符然后进行for循环满足题目要求的左旋次数,先将字符‘A’保存起来,然后将'BCD‘依次向前移,最后再将’A‘放进最后一位即可满足条件,下面我们进行操作.

代码如下:

void my_leftmove(char* arr, int m)
{
  int len = strlen(arr);
  int i,j;
  for (i = 0; i < m; i++)
  {
    //旋转一个字符
    //1.将第一个字符存起来
    char p = *arr;
    //2.将后面的字符依次往前移
    for (j = 0; j < len - 1; j++){
      *(arr + j) = *(arr + j + 1);
  }
    //3.把保存的字符放在最后一位
    *(arr + len - 1) = p;
  }
}
int main()
{
  char arr[] = "ABCD";
  int k;
  scanf("%d", &k);
  my_leftmove(arr, k);
  printf("%s", arr);
  return 0;
}

2.

字符串旋转结果

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

代码1如下:

#include<stdio.h>
void my_leftmove(char* arr, int m)
{
  int len = strlen(arr);
  int i,j;
  for (i = 0; i < m; i++)
  {
    //旋转一个字符
    //1.将第一个字符存起来
    char p = *arr;
    //2.将后面的字符依次往前移
    for (j = 0; j < len - 1; j++){
      *(arr + j) = *(arr + j + 1);
  }
    //3.把保存的字符放在最后一位
    *(arr + len - 1) = p;
  }
}
int  is_moveleft(char a1[], char a2[])
{
  int len1= strlen(a1);
  int len2 = strlen(a2);
  //先判断字符串长度是否相等,不相等则直接返回;
  if (len1 != len2) {
    return 0;
  }
  int i=0;
  for (i = 0; i < len1; i++) {
    //字符串左移
    my_leftmove(a1, 1);
    //比较俩个数组是否相等;
    if (strcmp(a1, a2) == 0) {
      return 1;
    }
  }
  return 0;
}
int main()
{
  char a1[] = "ABCDE";
  char a2[] = "BCD";
  int ret = is_moveleft(a1,a2);
  if (ret == 1) {
    printf("YES\n");
  }
  else {
    printf("NO\n");
  }
  return 0;
}

代码2如下:

#include<stdio.h>
#include<assert.h>
#include<assert.h>
int is_moveleft(char a1[], char a2[]) {
  //判断是否为空
  assert(a1);
  assert(a2);
  int len1 = strlen(a1);
  int len2 = strlen(a2);
  if (len1 != len2) {
    return 0;
  }
  int i = 0;
  //给a1后面追加一个a1的字符串
  strncat(a1, a1, len1);
  //判断a2是否是a1的字符串
  if (NULL == strstr(a1, a2)) {
    return 0;
  }
  else {
    return 1;
  }
}
int main()
{
  char a1[] = "ABCDE";
  char a2[] = "BCDEA";
  int ret = is_moveleft(a1,a2);
  if (ret == 1) {
    printf("YES\n");
  }
  else {
    printf("NO\n");
  }
  return 0;
}
相关文章
|
7月前
|
存储 编译器 C语言
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
131 0
|
7月前
|
存储 C++
使用字符指针变量和字符数组的比较
使用字符指针变量和字符数组的比较
75 0
|
7月前
|
C语言
C语言----字符数组&&指针
C语言----字符数组&&指针
51 0
|
存储 编译器 C语言
C语言之字符指针
C语言之字符指针
|
7月前
|
存储 C语言
字符指针变量与字符数组的比较
字符指针变量与字符数组的比较
56 3
|
7月前
|
存储 C语言
字符指针作为函数参数
字符指针作为函数参数
71 2
|
7月前
DAY-2 | 哈希表、指针与区间划分:字符种数统计问题
```markdown ## 题干 [牛客网链接](https://www.nowcoder.com/practice/eb94f6a5b2ba49c6ac72d40b5ce95f50) ## 题解 1. **查表法(哈希表)**:利用数组标记出现过的 ASCII 值小于127的字符,首次出现计数,重复则忽略。 2. **指针与区间划分(回头法)**:遍历字符串,对每个字符检查其前所有字符是否重复,重复则不计数。 ## 方法总结 - 哈希表在去重问题中非常实用,可多做相关练习。 - 使用`continue`时注意避免死循环,确保循环变量会改变。 - 多回顾此类问题以巩固理解。 ```
45 2
|
7月前
|
存储 C语言
C语言中的字符指针技术详解
C语言中的字符指针技术详解
77 0
|
7月前
|
存储 人工智能
字符指针变量和字符数组注意事项(区别)
字符指针变量和字符数组注意事项(区别)
42 0
|
7月前
|
安全 C语言 C++
字符指针做函数参数
字符指针做函数参数
41 1