可能没有问题。我查阅了其他答案,并尝试了他们的做法。但我每次都会犯错误。这是我的凯撒密码程序的第一个片段。
#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
中的无效字符。