我想写一个if-else语句来检查输入的字符长度是否为1
char temp;
printf("Enter colour: ");
scanf(" %c", &temp);
if (strlen(temp) > 1) {
printf("Value most only be one character");
}
else {
nextFunction();
}
然而,在这里使用strlen()使我的程序停止,我不知道为什么。我还尝试将第三行更改为scanf(" %s", &temp)
,但这也不起作用。我还能如何检查和处理字符输入的长度?
您正在读取和存储定义中的单个字符。
类型为char
的变量存储单个字符值-'A'
,'n'
,'5'
等
您的scanf
调用只读取单个字符-格式字符串" %c"
告诉scanf
跳过任何空白并读取下一个非空白字符,该字符被存储到temp
。
strlen
调用正在爆炸,因为它期望参数是一个指针指向以0结尾的字符串的第一个字符-基本上是一个地址,并且没有单个字符值将是有效的指针值。
在这种情况下,strlen
调用是不必要的-您真正需要做的是检查scanf
的返回值以确保输入操作成功。scanf
将返回成功读取和分配的输入项数,或者EOF
在文件结束或错误:
if ( scanf( " %c", &temp ) == 1 )
// do something with temp
else
// EOF or error
如果你想存储一个字符串,那么你需要创建一个数组char
:
#define MAX_STRING_LENGTH 20 // or however long your string can be
...
char str[MAX_STRING_LENGTH+1]; // +1 for the string terminator
if ( scanf( "%s", str ) == 1 ) // note no & operator
// do something with str
这是不安全的——如果你输入的字符串长度超过了数组所能容纳的长度,这些多余的字符将被写入数组后面的内存中,可能会覆盖一些重要的内容。
您可以通过在格式说明符中指定最大宽度来使其更安全:
scanf( "%20s", str );
但是它必须是硬编码的——你不能像使用printf
那样使用运行时参数。您可以创建一个将扩展到"%20s"
(或您将MAX_STRING_LENGTH
设置为的任何内容)的预处理器宏:
#define EXP(x) #x
#define FMT(x) "%" EXP(x) "s"
if ( scanf( FMT(MAX_STRING_LENGTH), str ) == 1 )
// do something with str
但是使用fgets
更安全,更容易:
if ( fgets( str, sizeof str, stdin ) )
// do something with str
这里唯一的问题是,如果有空间,fgets
会将尾随换行符存储到数组中,所以你必须以某种方式处理它:
size_t end = strlen( str );
if ( str[end] == 'n' )
str[end] = 0;