c语言 - 为什么使用 scanf 会出现分段错误?我已经初始化并设置了内存大小,但仍然出现 seg 错误



可能没有问题。我查阅了其他答案,并尝试了他们的做法。但我每次都会犯错误。这是我的凯撒密码程序的第一个片段。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main()
{
char message[81];
char cipher[81];

do
{
printf("Enter a message: ");
scanf("%[^n]", &message); 
//scanf("%s", &message) = error as well
printf("Test"); //to see if it prints. doesn't print, so seg fault must be on above line
if (!isalpha(message))
{
printf("Invalid input. Enter only letters.n");
}
else
{
valid = 1;
}
} while (valid == 0);
// ...

作为输入,我会输入任何东西——一个字符串、一个字符、一个数字等等,但我仍然会得到一个seg错误。

我正在用-W-Wall-ansi-pedantic编译我的代码,并且没有收到与seg错误相关的错误或警告。

对于初学者来说,这个调用中的参数类型

scanf("%[^n]", &message);

无效。你需要写

scanf("%[^n]", message);

您还需要在下一次调用scanf之前从输入缓冲区中删除换行符"\n"。

函数isalpha需要一个类型为char的对象。但是您正在传递一个类型为char *的表达式。

if (!isalpha(message))

调用未定义的行为。

还有一个问题出现在您的代码片段中,其中声明了变量valid

如果要检查字符串是否包含字母符号或/和空格,则需要检查输入字符串的所有符号。

这是一个示范节目。

#include <stdio.h>
#include <ctype.h>
int all_letters( const char *s )
{
while ( *s && isalpha( ( unsigned char )*s  ) ) ++s;

return *s == '';
}
int main(void) 
{
char message[81];
int valid = 0;

do
{
printf( "Enter a message: " );
scanf( "%80[^n]", message );
while ( getchar() != 'n' );

valid = all_letters( message );

if ( !valid )
{
printf( "Invalid input. Enter only letters.n" );
}
} while ( !valid );

return 0;
}

它的输出可能看起来像

Enter a message: 123
Invalid input. Enter only letters.
Enter a message: Hello

我在valgrind下运行了这段代码,错误实际上在这里的这一行:

if (!isalpha(message))

请记住,isalpha包含一个char(从技术上讲是int,但它应该只包含一个字符(。通过传递message,您传递的是一个char [81],它不是正确的类型。

令我困惑的是,即使将警告级别提高到最大值,为什么它也会编译和运行,因为从char [81]到单个char没有隐式转换。

要解决此问题,您需要更改在此处编写的代码,以便更明确地测试输入的所有字符是否都是字母。您可能还需要检查scanf的返回值,以确保它不会失败,并在失败时清除stdin中的无效字符。

相关内容

  • 没有找到相关文章

最新更新