首页 > 解决方案 > 函数中整数和寄存器常量字符的解释

问题描述

char firstmatch(char *s1, char *s2) {
    char *temp;
    temp = s1;
    do {
        if (strchr(s2, *temp) != 0)
            return temp;
        temp++;
    } while (*temp != 0);
    return 0;
}

char *strchr(register const char *s, int c) {
    do {
        if (*s == c) {
            return (char*)s;
        }
    } while (*s++);
    return (0);
}

我是编程新手,我得到了这段代码,它可以在 string 中找到第一个s1字符s2。任务是理解 C 代码并将其转换为汇编代码。到目前为止,我的重点只是了解 C 代码在做什么,而我目前在使用指针时遇到了困难。我可以对函数上的代码进行排序,firstmatch()然后往下走,但我对char * strchr()函数有点困惑。我无法理解int c关于常量字符指针的意义是什么?如果有人可以帮助解释它,我将不胜感激。

标签: cfunctionpointers

解决方案


代码示例中的函数strchr()是标准 C 库函数的不完整实现,它定位 C 字符串中第一次出现的字符(如果有)。

由于历史原因,参数具有类型int:在语言函数的早期版本中,只有在隐式类型int不够时才会输入参数。字符参数作为值传递int,因此不需要以不同方式键入参数。

register关键字已过时:早期的 C 编译器不如当前编译器先进,程序员可以通过使用register关键字修饰其定义来帮助代码生成器确定将哪些变量存储在 CPU 寄存器中。现代编译器效率更高,通常在这个游戏中击败程序员,因此这个关键字现在大多被忽略。

但是请注意,此实现的行为与标准函数不同:c必须char在比较之前将 的值转换为。正如 chux 所指出的,<string.h>出于比较目的,所有函数都将 C 字符串和内存块中的字节视为无符号字符。

这是具有正确行为的更具可读性的版本:

#include <string.h>

char *strchr(const char *str, int c) {
    const unsigned char *s = (const unsigned char *)str;
    do {
        if (*s == (unsigned char)c) {
            return (char *)s;
        }
    } while (*s++ != '\0');
    return NULL;
}

推荐阅读