字符串根据特定标志范围反转

本文介绍了如何使用C语言实现将输入的网址,除www和域名外,其他部分按点号分隔并反转每个部分的示例,使用了strtok函数进行字符串分割和reverseString函数进行字符串反转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

输入一个字符串s(长度不超过1000)表示网址,网址以cn或者com结尾,现在需要你将网址中除了www与域名(cn或者com)以外的部分,以分隔符点(.)为单位,每段单独反转。比如网址s = "www.baidu.zhidao.com" 反转后的结果为"www.udiab.oadihz.com".请输出反转之后的结果。(网址除了末尾不会出现包含cn或者com的字母)

代码

#include <stdio.h>
#include <string.h>
#define H 10
#define L 20
// 反转字符串
void reverseString(char* str) {
    int left = 0;
    int right = strlen(str) - 1;
    while (left < right) {
        char temp = str[left];
        str[left] = str[right];
        str[right] = temp;
        left++;
        right--;
    }
}
int main() {
    char str[1000];
    printf("请输入网址:");
    scanf("%s", str);
    int i = 0;
    printf("反转前的结果:%s\n", str);
    char tokens[H][L] = { 0 };
        char* token;   
        int count = 0;
        // 使用strtok函数分割字符串并存储到数组中
        token = strtok(str, ".");
        while (token != NULL && count < H) 
        {
            strcpy(tokens[count], token);
            count++;
            token = strtok(NULL, ".");
        }
        int n = count-1;
        if (count!=2)
        {
            while ((n--)!=0)
            {
                reverseString(tokens[n]);

            }
        }
        printf("反转后的结果:");
        // 打印数组中的字符串
        for (i = 0; i <count-1; i++) 
        {
            printf("%s.", tokens[i]);
        }
        printf("%s", tokens[i]);

        return 0;
    }

知识点补充

 字符串数组

 C语言零碎知识点之字符串数组_c语言字符串数组-优快云博客

 strstr

在一个字符串中找另一个字符串(查找字符串)
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
返回值是指针,返回的是子字符串在原先字符串中第一次出现的位置,如果没有找到的话,就返回NULL

char arr1[] = "abcdef";
	char arr2[] = "bcd";
	char *ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}

strchr 

 strchr函数功能为在一个串中查找给定字符的第一个匹配之处。函数原型为:char *strchr(const char *str, int c),即在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。strchr函数包含在C 标准库 <string.h>中。
str-- 要被检索的 C 字符串。
c-- 在 str 中要搜索的字符。
返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。
注意,该函数式大小写区分的函数,大小字母和小写字母被看成是不一样的

const char str[] = "http://www.runoob.com";
   const char ch = '.';
   char *ret;
   ret = strchr(str, ch);
   printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);

strtok

1、函数原型

char *strtok(char *str, const char *delim)

2、参数

  • str—要被分解的字符串
  • delim—用作分隔符的字符(可以是一个,也可以是集合)

3、返回值

  • 该函数返回被分解的第一个子字符串,若无可检索的字符串,则返回空指针
int main () {
   char str[80] = "aaa - bbb - ccc";
   const char s[2] = "-";   //字符串里可以是一个分隔符,也可以是分隔符的集合
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, s);
   
   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
      printf( "%s\n", token );
    
      token = strtok(NULL, s);
   }

 strcpy

 是将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件,同时也会将 '\0' 也复制到目标空间。下面是库中的strcpy()函数声明:

char* strcpy(char* destination,const char* source);

   1. 函数的参数:

  • char* destination---------目标字符串的首地址
  • const char* source------源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串

   2.函数的返回值类型:

  • char*:返回的是目标字符串的首地址 
char arr[10] = "########";
	printf("%s\n", strcpy(arr,"hello"));

strncpy

char *strncpy(char *dest, const char *src, size_t n);

拷贝src字符串的前n个字符至dest

 char arr1[] = "I LOVE YOU";
    char arr2[] = "SORRY";
    strncpy(arr1, arr2,5);
    //经过函数strncpy后 ,arr1里应该是字符串 SORRYE YOU
    printf("arr1: %s\n", arr1);

strcat

char *strcat(char *_Destination,const char *_Source)

 在一个字符串后面追加一个字符串,也就是将两个字符串拼接起来。先找到目标空间中字符串的'\0',然后将源字符串在'\0'处进行拷贝。

  • 返回值类型为char*,是目标空间的起始地址
  • 函数的参数,第一个是目标空间的起始地址,第二个是源字符串的起始地址。
char arr1[30] = "hello";

char arr2[] = "world";

strcat(arr1, arr2);

printf("%s\n", arr1);//追加字符串

return 0;

strcmp

 int strcmp( const char *string1, const char *string2 );

返回一个整数 

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字
  • 会比较对应位置的字符大小
char arr1[] = "abcd";
    char arr2[] = "abq";
    
    int ret = strcmp(arr1, arr2);
    if (ret >0)
    {
        printf("大于");
    }
    else if (ret <0)
    {
        printf("小于");
    }
    else {
        printf("等于");
  • 答案是小于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值