gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:33:47 24 4
gpt4 key购买 nike

我无法在 main() 中使用 else 条件。当在字符串中找不到字符时,该代码不起作用。我应该如何修改 main 中的 return 语句或 else 条件?

#include <stdio.h>

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

void main() {
char str[20], ch;
printf("Enter a string :");
gets(str);
printf("Enter character to search in string :");
scanf("%c", &ch);

char *r = xstrchr(str, ch);
printf("%c is stored at %d\n", *r, r);
if (r != NULL)
printf("Character '%c' found at %d index.\n", ch, (r - str + 1));
else
printf ("Character not found.");
}

char *xstrchr(char *s, char ch) {
int flag = 0, i = 0;
while (*(s + i) != '\0') {
if (*(s + i) == ch) {
flag = 1;
return (s + i);
}
i++;
}
if (flag == 0) {
return NULL;
}
}

最佳答案

您的函数确实返回 NULL当找不到该字符,但 main() 中有未定义的行为时当您取消引用 r 时它会这样做在 printf测试 NULL 之前的声明结果,导致你的程序崩溃。

还有其他问题:

  • main 的原型(prototype)应该是int main(void)int main(int argc, char *argv[])或者可能int main() .

  • 您不得使用gets() 。该函数已从 C 语言中删除,因为它无法安全使用。如果用户在提示符处输入超过 19 个字符,您的程序将出现未定义的行为,如 gets()将写入超出数组末尾的内容。

  • 指针不应打印 %d ,你应该写:

    printf("%c is stored at %p\n", *r, (void *)r);
  • 两个指针的差异的类型为 ptrdiff_t ,它可能大于 int并且不应打印 %d 。标准格式为 %td ,但许多 C 库不支持此功能,因此将差异转换为 int可能更可取:

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

  • 您应该测试 fgets() 的返回值和scanf()检测文件过早结束或其他输入失败。

  • 索引值可能超出类型 int 的范围。您应该使用类型 size_t对于 ixstrchr() .

  • flag未在 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;
}

最后,xstrchr()功能与标准规范不完全匹配strchr()功能:

  • ch 的参数类型是 int ,但其值转换为 char出于比较目的。

  • s 的参数类型是 const char *因为该函数没有修改字符串,但返回类型是 char *因此返回值必须转换为 (char *) ,这是一个不幸但必要的步骤。

  • 如果ch,则将匹配字符串末尾的空终止符具有空值。

  • 递增 s许多 C 程序员更喜欢使用索引变量来代替索引变量。

这是修改后的版本:

char *xstrchr(const char *s, int ch) {
for (;; s++) {
if (*s == (char)ch)
return (char *)s;
if (*s == '\0')
return NULL;
}
}

关于c - 当在函数 xstrchr 中找不到字符时无法返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55155668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com