问题
输入一个字符串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;
}
知识点补充
字符串数组
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("等于");
- 答案是小于