如何在C中检查字符的长度

eh57zj3b  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(127)

我想写一个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),但这也不起作用。否则我怎么检查和处理字符输入的长度呢?

ohfgkhjo

ohfgkhjo1#

你正在阅读和存储一个字符的定义。
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

如果要存储一个 string,则需要创建一个chararray

#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;

相关问题