如何检查c中字符的长度



我想写一个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;              

相关内容

  • 没有找到相关文章

最新更新