在函数xstrchr中找不到字符时,无法返回NULL

在函数xstrchr中找不到字符时,无法返回NULL,c,null,return,c-strings,return-type,C,Null,Return,C Strings,Return Type,我基本上不能利用其他条件。在字符串中找不到字符时,代码不起作用。我应该如何修改main中的return语句或else条件 当找不到字符时,函数确实返回NULL,但如果在测试NULL结果之前在printf语句中取消引用r,则函数在main中有未定义的行为,从而导致程序崩溃 还有其他问题: main的原型应该是int mainvoid或int main argc、char*argv[]或可能是int main 你必须使用它。此函数已从C语言中删除,因为它无法安全使用。如果用户在提示下键入的字符超过1

我基本上不能利用其他条件。在字符串中找不到字符时,代码不起作用。我应该如何修改main中的return语句或else条件

当找不到字符时,函数确实返回NULL,但如果在测试NULL结果之前在printf语句中取消引用r,则函数在main中有未定义的行为,从而导致程序崩溃

还有其他问题:

main的原型应该是int mainvoid或int main argc、char*argv[]或可能是int main

你必须使用它。此函数已从C语言中删除,因为它无法安全使用。如果用户在提示下键入的字符超过19个,则程序将具有未定义的行为,因为GET将在数组末尾之外写入

指针不应该用%d打印,您应该写:

printf("%c is stored at %p\n", *r, (void *)r);
两个指针的差异具有类型ptrdiff_t,该类型mau大于int,不应使用%d打印。标准格式为%td,但许多C库不支持此格式,因此最好将差异转换为int:

printf("Character '%c' found at %d index.\n", ch, (int)(r - str + 1));
在C中,索引值从0开始。将数组的第一个元素称为索引1是令人困惑的

您应该测试fgets和scanf的返回值,以检测文件过早结束或其他输入故障

索引值可能超过int类型的范围。您应该在xstrchr中为i使用类型size_t

xstrchr函数中未使用标志:更新代码和测试是冗余的,可以删除

*s+i可以写成s[i],可读性更强。除非需要显式使用指针算术语法,否则应使用括号内的语法

以下是更正的版本:

#include <stdio.h>

char *xstrchr(char *string, char ch);

int main() {
    char str[200], ch;
    printf("Enter a string: ");
    if (!fgets(str, sizeof str, stdin))
        return 1;
    printf("Enter character to search in string: ");
    if (scanf("%c", &ch) != 1)
        return 1;
    char *r = xstrchr(str, ch);
    if (r != NULL) {
        printf("Character '%c' found at %d index.\n", ch, (int)(r - str));
    else
        printf("Character not found.\n");
    return 0;
}

char *xstrchr(char *s, char ch) {
    size_t i = 0;
    while (s[i] != '\0') {
        if (s[i] == ch) {
            return s + i;
        }
        i++;
    }
    return NULL;
}
char *xstrchr(const char *s, int ch) {
    for (;; s++) {
        if (*s == (char)ch)
            return (char *)s;
        if (*s == '\0')
            return NULL;
    }
}

有可能用char得到null吗?*s+i应该写成s[i]。标志变量是无用的-它总是0,除非在返回之前设置。return不是函数,不需要括号。%d不能用于打印地址,请使用%p,使用size\u t作为字符串的索引,main必须返回int。永远不要使用get!这是一个好主意。使用例如,相反,但要注意函数之间的差异。代码不起作用不是对问题的有用描述。请始终告诉我们您的期望,您得到了什么以及您在测试中使用了什么输入。
char *xstrchr(const char *s, int ch) {
    for (;; s++) {
        if (*s == (char)ch)
            return (char *)s;
        if (*s == '\0')
            return NULL;
    }
}