gpt4 book ai didi

c - "Segmentation Fault (core dumped)"是什么?为什么它会在我的输出中返回?

转载 作者:行者123 更新时间:2023-11-30 21:27:20 27 4
gpt4 key购买 nike

我试图用一次 fgets 调用替换包含重复 getchar 调用的循环

当我尝试输入输入时,我收到段错误(核心转储),但我不知道那是什么或为什么会收到它。

起始代码

/* Example: analysis of text */

#include <stdio.h>
#include <string.h>

#define MAX 1000 /* The maximum number of characters in a line of input */

main()
{
char text[MAX], c;
int i;
int lowercase, uppercase, digits, other;
int length;

puts("Type some text (then ENTER):");

/* Save typed characters in text[]: */
// In ex1.c, please implement the following loop with fgets() and use strlen() to compute the length of the string
//
for (i = 0; i < MAX; i++)
{
text[i] = getchar();
if (text[i] == '\n')
break;
}
length = i;

/* Analyse contents of text[]: */

for (i = lowercase = uppercase = digits = other = 0; i < MAX; i++)
{
c = text[i];
if (c >= 'a' && c <= 'z')
lowercase++;
else if (c >= 'A' && c <= 'Z')
uppercase++;
else if (c >= '0' && c <= '9')
digits++;
else
{
if (c == '\n')
break;
other++;
}
}

puts("\nYou typed:");
printf("A string with %d characters\n", length);
printf("\t%d lower case letters\n", lowercase);
printf("\t%d upper case letters\n", uppercase);
printf("\t%d digits\n", digits);
printf("\t%d others\n", other);
}

起始代码测试

Type some text (then ENTER):
asd213qaIW

You typed:
A string with 10 characters
5 lower case letters
2 upper case letters
3 digits
0 others

我的代码

/* Example:  analysis of text */
#include <stdio.h>
#include <string.h>
#define MAX 1000 /* The maximum number of characters in a line of input */

main()
{
char text[MAX], c;
int i;
int lowercase, uppercase, digits, other;
int length;

puts("Type some text (then ENTER):");

/* Save typed characters in text[]: */
// In ex1.c, please implement the following loop with fgets() and use strlen() to compute the length of the string
//
c = fgets(text, MAX, stdin);
length = strlen(c);

/* Analyse contents of text[]: */

for (i = lowercase = uppercase = digits = other = 0; i < MAX; i++)
{
c = text[i];
if (c >= 'a' && c <= 'z')
lowercase++;
else if (c >= 'A' && c <= 'Z')
uppercase++;
else if (c >= '0' && c <= '9')
digits++;
else
{
if (c == '\n')
break;
other++;
}
}

puts("\nYou typed:");
printf("A string with %d characters\n", length);
printf("\t%d lower case letters\n", lowercase);
printf("\t%d upper case letters\n", uppercase);
printf("\t%d digits\n", digits);
printf("\t%d others\n", other);
}

我的代码测试

Type some text (then ENTER):
asd213qaIW
Segmentation fault (core dumped)

非常感谢任何和所有帮助。
我对 C 也很陌生,所以如果你能尽可能简单地解释一下。

更改 length = strlen(c); 更改为 length = strlen(text); 修复。谢谢!

最佳答案

您的错误或至少其中一个错误似乎位于以下几行中:

char text[MAX], c;
// ...

c = fgets(text, MAX, stdin);
length = strlen(c);

fgets 的返回值是指向 char 的指针,但您将其存储在 char 中> 然后尝试将 char 值传递给需要指向 char 的指针的函数。由于 char 只有 8 位宽(在您要编译的任何机器上),而指针需要 32 或 64 位,因此大多数位都会丢失,结果是无效指针。如果幸运的话,这将使程序因段错误而崩溃。

这段代码根本不应该被编译。如果您至少没有收到 c 无法保存指针 char 的警告,则需要打开更多警告标志。 (在 gccclang 上,我通常使用 -std=c99 -Wall -Wextra -Wpedantic -Wconversion 进行编译。)然后,至少在如果您正在学习该语言,请将收到的任何警告视为程序中的错误。更好的是,添加 -Werror (或编译器的等效项)以使编译器以这种方式对待它们。

最简单的修复方法是消除 c 并改为写入

fgets( text, MAX, stdin );
length = strlen(text);

关于c - "Segmentation Fault (core dumped)"是什么?为什么它会在我的输出中返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52634818/

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