两个简单的指针操作,看看你是否有思路并且能实现。
1.请编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定 字符集合中出现的字符
查找source字符串中匹配chars字符串中任何字符的第1个字 符,函数然后返回一个指向source中第1个匹配所找到的位置的指针。如果source 中的所有字符均不匹配chars中的任何字符,函数就返回一个NULL指针。如果任何 一个参数为NULL,或任何一个参数所指向的字符串为空,函数也返回一个NULL指 针。 举个例子,假定source指向ABCDEF。如果chars指向XYZ、JURY或QQQQ,函数 就返回一个NULL指针。如果chars指向XRCQEF,函数就返回一个指向source中C字 符的指针。参数所指向的字符串是绝不会被修改的。
函数原型:char *find_char( char const *source, char const *chars );
实现:
char* find_char(char const* source, char const* chars)
{
char* temp_1 = source;
char* temp_2 = chars;
if (source == NULL || chars == NULL)
return NULL;
while (*temp_1 != '\0')
{
temp_2 = chars;
while (*temp_2 != '\0')
{
if (*temp_1 == *temp_2)
return *temp_1;
temp_2++;
}
temp_1++;
}
return NULL;
}
测试:
char const* soucre = "nsdfgh";
char const* chars = "bbsabs";
char* vp = NULL;
char res = '0';
vp = find_char(soucre, chars);
if (vp == NULL)
printf("Defult");
else
{
printf("sucess %c", vp);
}
find_char
函数接收两个参数:source
表示源字符串,chars
表示字符集合字符串。函数会遍历 source
字符串,逐个字符与 chars
字符集合进行比较。如果找到匹配的字符,函数会返回该字符在 source
字符串中的位置(指针)。如果没有找到匹配字符,函数返回 NULL
。
注意:
不能写成:
while (*temp_1++ != '\0')
{
temp_2 = chars;
while (*temp_2++ != '\0')
{
if (*temp_1 == *temp_2)
return *temp_1;
}
}
return NULL;
这样的后果是:soucre的第一个字符被忽略
2.函数把参数字符串中的字符反向排列
函数把参数字符串中的字符反向排列。请使用指针而不是数组下标,不要使用 任何C函数库中用于操纵字符串的函数。不能声明一个局部数组来临时存储参数字符串。
函数原型:void reverse_string( char *string );
实现:
void reverse_string(char* str)
{
char* temp = str;
while (*temp != '\0')
{
temp++;
}
int offest = temp - str;
temp--;
for (int i = 0; i < offest / 2; i++)
{
char tempchar;
tempchar = *str;
*str = *temp;
*temp = tempchar;
str++;
temp--;
}
}
测试:
注意:
声明一个字符串有两种写法:
char* soucre="abcdefg";
char soucre[]="abcdefg";
对于声明 char* source = "abcdefg";
,在语法上是合法的,但在 C 语言中,这种声明方式存在潜在的问题。在这种情况下,source
是一个字符指针,指向字符串常量 "abcdefg"
的首字符。然而,字符串常量是只读的,其内容不能被修改。
这意味着,尝试通过修改 source
指针所指向的字符串内容可能会导致未定义的行为。在某些情况下,这可能会导致程序崩溃或产生意外结果。
如果需要修改字符串的内容,应该使用字符数组而不是字符指针来存储字符串。例如,可以使用 char source[] = "abcdefg";
来声明一个字符数组,并对其进行修改。这样更安全可靠。
如果您只需要读取字符串内容而不修改它,那么使用字符指针是合适的。但请确保不会尝试修改字符串常量的内容,以避免潜在的问题。