如何更改我的 C 代码以使用指针?
How do I alter my C code to use pointers?
任务最初是 return string
中 stop
中任何字符的第一个实例的索引:
int find_any_index(char string[], char stop[]) {
int i = 0;
int j = 0;
while(string[i++] != '[=10=]'){
while(stop[j++] != '[=10=]'){
if(string[i-1] == stop[j-1]){
return i-1;
}
}
j = 0;
}
return NOT_FOUND ;
}
find_any_index("abcdefg", "zyd")
例如,查找索引 3。
但是,我现在需要按照以下规定完成同样的任务:
- 不能使用整数
- 不能使用数组索引
- 无法使用
<string.h>
中的任何功能
- Returns 一个指针而不是索引
char *find_any_ptr(char *string, char* stop) {
return NULL ; // placeholder
}
我几乎不懂指针,也不明白如何使用它们来访问单个字符而不是在数组中递增。
你可以从 C 语言中的 a[1] 等价于 *(a+1) 开始。
限制 "Cannot use integers" 可能表明您应该改用类型 "char"。它的作用类似于整数,但仅限于 8 位范围 (0-255)。
下面是您的函数的框架:
char* find_any_index(char string[], char stop[])
{
char* cp1 = string;
char* cp2 = NULL;
for ( ; *cp1 != '[=10=]'; ++cp1 )
{
for ( cp2 = stop; *cp2 != '[=10=]'; ++cp2 )
{
}
}
return NULL;
}
我想你可以完成剩下的。
在这种情况下,您将使用字符指针。在这里,您将对照 stop
中的每个字符检查 string
中的每个字符。当匹配 stop
中的任何字符时,return 指向 string
中位置的指针。如果未找到匹配项(return string
或 NULL
,示例 returns NULL
)示例:
char *find_any_index(char string[], char stop[]) {
char *p = string;
char *sp = NULL;
while (*p)
{
sp = stop;
while (*sp)
{
if (*sp == *p)
return p;
sp++;
}
p++;
}
return NULL;
}
不幸的是,不管怎样,这个任务中总会有整数。 char
和 unsigned char
是整数类型。我假设任务是生成高效的代码,没有不必要的变量(整数或其他)。
通过首先迭代 stop
,我们可以构建一个查找 table。 table 中的每一位将对应于该位位置的字符是否存在于 stop
.
中
unsigned char table[CHAR_MAX / CHAR_BIT + 1] = { 0 };
while (*stop) {
unsigned char c = *stop++;
table[c / CHAR_BIT] |= 1 << c % CHAR_BIT;
}
这将内部循环减少为单比特测试,将常数时间复杂度从O(mn)
减少到O(m+n)
。
while (*string) {
unsigned char c = *string;
if (table[c / CHAR_BIT] & (1 << c % CHAR_BIT)) {
return string;
}
string++;
}
从技术上讲,c
是一个不必要的变量(也是一个整数),但是通过在每段代码中使用 c
,我消除了两个转换,从而提高了这段代码的易读性。我认为这更重要。
任务最初是 return string
中 stop
中任何字符的第一个实例的索引:
int find_any_index(char string[], char stop[]) {
int i = 0;
int j = 0;
while(string[i++] != '[=10=]'){
while(stop[j++] != '[=10=]'){
if(string[i-1] == stop[j-1]){
return i-1;
}
}
j = 0;
}
return NOT_FOUND ;
}
find_any_index("abcdefg", "zyd")
例如,查找索引 3。
但是,我现在需要按照以下规定完成同样的任务:
- 不能使用整数
- 不能使用数组索引
- 无法使用
<string.h>
中的任何功能
- Returns 一个指针而不是索引
char *find_any_ptr(char *string, char* stop) {
return NULL ; // placeholder
}
我几乎不懂指针,也不明白如何使用它们来访问单个字符而不是在数组中递增。
你可以从 C 语言中的 a[1] 等价于 *(a+1) 开始。 限制 "Cannot use integers" 可能表明您应该改用类型 "char"。它的作用类似于整数,但仅限于 8 位范围 (0-255)。
下面是您的函数的框架:
char* find_any_index(char string[], char stop[])
{
char* cp1 = string;
char* cp2 = NULL;
for ( ; *cp1 != '[=10=]'; ++cp1 )
{
for ( cp2 = stop; *cp2 != '[=10=]'; ++cp2 )
{
}
}
return NULL;
}
我想你可以完成剩下的。
在这种情况下,您将使用字符指针。在这里,您将对照 stop
中的每个字符检查 string
中的每个字符。当匹配 stop
中的任何字符时,return 指向 string
中位置的指针。如果未找到匹配项(return string
或 NULL
,示例 returns NULL
)示例:
char *find_any_index(char string[], char stop[]) {
char *p = string;
char *sp = NULL;
while (*p)
{
sp = stop;
while (*sp)
{
if (*sp == *p)
return p;
sp++;
}
p++;
}
return NULL;
}
不幸的是,不管怎样,这个任务中总会有整数。 char
和 unsigned char
是整数类型。我假设任务是生成高效的代码,没有不必要的变量(整数或其他)。
通过首先迭代 stop
,我们可以构建一个查找 table。 table 中的每一位将对应于该位位置的字符是否存在于 stop
.
unsigned char table[CHAR_MAX / CHAR_BIT + 1] = { 0 };
while (*stop) {
unsigned char c = *stop++;
table[c / CHAR_BIT] |= 1 << c % CHAR_BIT;
}
这将内部循环减少为单比特测试,将常数时间复杂度从O(mn)
减少到O(m+n)
。
while (*string) {
unsigned char c = *string;
if (table[c / CHAR_BIT] & (1 << c % CHAR_BIT)) {
return string;
}
string++;
}
从技术上讲,c
是一个不必要的变量(也是一个整数),但是通过在每段代码中使用 c
,我消除了两个转换,从而提高了这段代码的易读性。我认为这更重要。