如何向用户请求字符,然后打印字符的大小?

How do I request characters from a user, and then print the size of the characters?

我是 C 的新手,非常感谢任何帮助。 我无法使用 <string.h><ctype.h> 库。 这是我的代码:

int main(void)
{
    char character;
    printf("Introduce characters: ");
    scanf(" %c", &character);
    printf("\nSize of character: %d", sizeof(character)/sizeof(char));
    
    return 0;
}

这只会打印 1 作为大小。

我在另一个 post 中读到问题是 char character; 初始化字符只会让我存储 1 个字符。所以,我将它修改为一个数组:

int main(void)
{
    char character[10];
    printf("Introduce maximum 10 characters: ");
    scanf(" %s", character);
    printf("\nSize of character: %d", sizeof(character)/sizeof(char));

    return 0;
}

现在的问题是,通过执行 character[10],它打印出大小为 10。我该如何解决这个问题?

sizeof(character)/sizeof(char) 给出您声明的数组的大小,不是 用户输入的大小。

  1. sizeof(character)给出整个数组的字节数
  2. sizeof(char)给出单个字符的字节大小

因此,当您执行 sizeof(character)/sizeof(char) 时,您将获得数组的实际大小(即元素数)。您想要实现的目标可以用 strlen() 完成。不过既然不能用<string.h>,那可以自己写:

int strlen2(char *s)
{
    int size;
    for (size = 0; s[size]; size++)
        ;
    return size;
}

然后像这样使用它:

#include <stdio.h>

int main(void)
{
    char character[10];
    printf("Introduce maximum 10 characters: ");
    scanf("%s", character);
    printf("\nSize of character: %d", strlen2(character));
}

strlen2() 计算字符串的字符数,遇到第一个 [=21=] 字符(空终止符)时停止计数。


避免使用scanf()读取输入

您的代码容易出现错误。如果用户输入的字符串长度超过 9 个字符(不要忘记在字符串末尾添加了 [=21=]),就会出现缓冲区溢出,因为 character 只应该包含 10 个字符。您可能希望限制读入字符串的字符数:

scanf("%9s", character); // Read only the first 9 characters and ignore the rest

此外,scanf() 用于解析 输入,而不是实际读取它。使用 fgets() 代替:

#include <stdio.h>
#include <string.h> // for strcspn()

int main(void)
{
    char character[10];
    printf("Introduce maximum 10 characters: ");
    
    if(!fgets(character, 10, stdin)) {
        fprintf(stderr, "Error reading input.\n");
        return 1;
    }

    character[strcspn(character, "\n")] = '[=13=]'; // fgets() reads also `\n` so make sure to null-terminate the string
    
    printf("\nSize of character: %zu", strlen(character));
}

fgets() 接受三个参数:

  • 第一个是要存储用户输入的数组
  • 第二个是你数组的大小
  • 第三个是你要读取的文件流

它 returns NULL 失败所以你也应该检查一下。

好吧,如果您不能使用任何 headers,也许您可​​以创建一个自定义 strlen() 函数。

strlen() 几乎计算所有字符,直到找到 '[=14=]' 字符。 '[=14=]' 用于表示字符串的结尾,并自动附加 scanf("%s",...)

#include <stdio.h>

size_t ms_length(const char *s)
{
    size_t i = 0;

    for (; s[i] != '[=10=]'; i++)
        ;

    return i;
}

int main(void)
{
    char *str = "hello";

    printf("%zu\n", ms_length(str));

    return 0;
}

如果你想学究气,你甚至可能想检查 scanf() 的 return 值,以查找输入错误,并对要读取的字符应用限制以避免缓冲区溢出。

if (scanf(" %9s", character) != 1) /* 9 characters + 1 reserved for [=11=] */
  { 
     /* handle error */
     return 1;
  }