【问题标题】:How to check the length of input char array (%s) using scanf() in C如何在 C 中使用 scanf() 检查输入字符数组 (%s) 的长度
【发布时间】:2021-12-13 19:38:58
【问题描述】:

我需要使用函数scanf() 检查输入的长度。 我正在使用一个 char (%s) 数组来存储输入,但我无法检查此输入的长度。

下面是代码:

#include <stdio.h>

char chr[] = "";
int n;

void main()
{
    printf("\n");
    printf("Enter a character: ");
    scanf("%s",chr);     
    printf("You entered %s.", chr);
    printf("\n");

    n = sizeof(chr);    
    printf("length n = %d \n", n);
    printf("\n");

}   

在我尝试过的每种情况下,它都会返回“长度 n = 1”的输出。

在这种情况下如何检查输入的长度? 谢谢。

【问题讨论】:

  • strlen,但是你有 UB,因为char chr[] = ""; 只保留 1 个字节。改用char chr[256] = ""; 之类的方法。
  • @Jack Re:“返回一个 int,告诉你有多少字符被转换了”——不完全。如果它读取一个字符串,它将返回1,不管它用了多少个字符。
  • @yano 或safer
  • @yano 是的,我更新了它。我责怪我疲惫的眼睛:-)
  • @yano 我更改了 chr[256] 并包含了 。现在它正在工作,谢谢

标签: c input scanf


【解决方案1】:

使用 scanf() 检查输入字符数组 (%s) 的长度

  • 不要使用原始的"%s",使用 width 限制:比缓冲区大小小 1。

  • 使用足够大小的缓冲区。 char chr[] = ""; 只有 1 个 char

  • 当输入不读取空字符时,使用strlen()确定字符串长度。

      char chr[100];
      if (scanf("%99s", chr) == 1) {
        printf("Length: %zu\n", strlen(chr));
      }
    
  • Pedantic:如果代码可能读取 null 字符(这种情况很少或非常糟糕),请使用 "%n" 存储扫描的偏移量。

      char chr[100];
      int n1, n2;
      if (scanf(" %n%99s%n", &n1, chr, &n2) == 1) {
        printf("Length: %d\n", n2 - n1);
      }
    

【讨论】:

  • %n 在我的雷达下飞过。太好了,实际上回答了如何直接从scanf 获取长度的问题。
  • @TedLyngmo 注意重要的是要考虑潜在的前导空白以获得正确的长度,因为"%n" 从扫描开始算起,但"%s" 不保存前导(或任何)空白.
  • 知道了!我必须说的选择很少! " %n%99[^\n]%n" 可以是从一开始就获取空格的选项(如果需要,可以将它们包含在字符串中)。
  • @TedLyngmo 要包含空格('\n' 除外),可以使用 "%99[^\n]%n"。当chr[] 只是"\n" 时,请注意所有这些格式中所需的特殊处理。
【解决方案2】:

sizeof 是一个编译时一元运算符,可用于计算其操作数的大小。如果要计算字符串的长度,则必须使用strlen()。像这样

#include <stdio.h>
#include <string.h>
  
int main()
{
    char Str[1000];
  
    printf("Enter the String: ");
    if(scanf("%999s", Str) == 1) // limit the number of chars to  sizeof Str - 1
    {                            // and == 1 to check that scanning 1 item worked
        printf("Length of Str is %zu", strlen(Str));
    }
  
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 2014-04-05
    • 1970-01-01
    • 2011-12-14
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多