在函数xstrchr中找不到字符时,无法返回NULL
我基本上不能利用其他条件。在字符串中找不到字符时,代码不起作用。我应该如何修改main中的return语句或else条件 当找不到字符时,函数确实返回NULL,但如果在测试NULL结果之前在printf语句中取消引用r,则函数在main中有未定义的行为,从而导致程序崩溃 还有其他问题: main的原型应该是int mainvoid或int main argc、char*argv[]或可能是int main 你必须使用它。此函数已从C语言中删除,因为它无法安全使用。如果用户在提示下键入的字符超过19个,则程序将具有未定义的行为,因为GET将在数组末尾之外写入 指针不应该用%d打印,您应该写:在函数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
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;
}
}