C语言cin如何获取输入字符串的长度?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 C语言 正文

您提到的 cinC++ 中的输入流对象,而不是C语言的一部分,在C语言中,我们使用 scanf 函数来进行类似的格式化输入。

c语言cin length
(图片来源网络,侵删)

您的问题可以理解为两个部分:

  1. C语言中如何输入一个字符串? (对应C++的 cin)
  2. C语言中如何计算一个字符串的长度?

下面我将分步为您详细解释。


第一部分:C语言中如何输入字符串?(C语言的 cin)

在C语言中,主要有两种安全的方式(以及一种不安全但常见的方式)来输入字符串。

使用 scanf (简单但不安全)

scanf 函数可以用来读取输入,但它有一个很大的缺点:它不知道缓冲区有多大,容易导致缓冲区溢出,从而引发程序崩溃或安全漏洞。

c语言cin length
(图片来源网络,侵删)

语法: scanf("%s", 字符数组名);

注意: 这里不需要在 字符数组名 前面加 & 符号,因为数组名本身就会“衰变”为其首元素的地址。

示例代码 (不安全):

#include <stdio.h>
int main() {
    char name[20]; // 定义一个可以容纳19个字符+1个'\0'的数组
    printf("请输入你的名字: ");
    scanf("%s", name); // 危险!如果用户输入超过19个字符,就会溢出
    printf("你好, %s\n", name);
    return 0;
}

为什么不安全? 如果用户输入 abcdefghijklmnopqrstuvwxyz(超过19个字符),scanf 会试图将所有字符都写入 name 数组,这会覆盖掉数组后面的内存空间,导致不可预测的错误。

c语言cin length
(图片来源网络,侵删)

使用 fgets (推荐的安全方式)

fgets 是从文件中读取一行字符串的函数,但我们也可以用它来从标准输入(键盘)读取,它的最大优点是可以指定最大读取字符数,从而防止缓冲区溢出

语法: fgets(字符数组名, 最大读取字符数, stdin);

  • stdin 是标准输入流的宏定义,代表键盘输入。
  • fgets 会读取最多 最大读取字符数 - 1 个字符,然后在末尾自动添加一个字符串结束符 \0
  • 一个重要特性fgets 会保留输入时的换行符 \n(如果读取空间足够的话)。

示例代码 (安全):

#include <stdio.h>
#include <string.h> // 为了使用 strlen 和 strcspn
int main() {
    char name[20];
    printf("请输入你的名字: ");
    fgets(name, sizeof(name), stdin); // 安全!最多读取19个字符
    // 处理 fgets 保留的换行符
    name[strcspn(name, "\n")] = 0;
    printf("你好, %s\n", name);
    return 0;
}

代码解释:

  • sizeof(name) 会计算出数组 name 的总大小(这里是20),这是传递给 fgets 的最佳参数。
  • name[strcspn(name, "\n")] = 0; 这行代码的作用是找到字符串中 \n 的位置,并将其替换为字符串结束符 \0,这样输出时就不会多出一个换行了。

第二部分:C语言中如何计算字符串长度?(C语言的 length)

在C语言中,字符串的长度是指字符串中字符的个数,不包括结尾的字符串结束符 \0

C语言标准库 <string.h> 中提供了计算字符串长度的函数 strlen

使用 strlen 函数 (最标准、最常用)

strlen 会遍历字符串,直到遇到第一个 \0 为止,并返回它走过的字符数。

语法: size_t strlen(const char *str);

  • size_t 是一个无符号整数类型,通常用于表示大小或计数。
  • 参数 str 是指向字符串首字符的指针。

示例代码:

#include <stdio.h>
#include <string.h> // 必须包含此头文件
int main() {
    char greeting[] = "Hello, C Language!";
    // 使用 strlen 计算长度
    size_t length = strlen(greeting);
    printf("字符串是: \"%s\"\n", greeting);
    printf("字符串的长度是: %zu\n", length); // 注意使用 %zu 来打印 size_t 类型
    return 0;
}

输出:

字符串是: "Hello, C Language!"
字符串的长度是: 15

手动实现 strlen (理解原理)

为了更好地理解 strlen 的工作原理,我们可以自己写一个简单的版本。

思路: 创建一个指针指向字符串的开头,然后不断移动指针,直到指向的字符是 \0,最后用指针的最终位置减去初始位置,就得到了长度。

示例代码:

#include <stdio.h>
// 手动实现的 strlen 函数
size_t my_strlen(const char *str) {
    const char *s = str; // 保存起始地址
    while (*s != '\0') { // 当当前字符不是 '\0' 时,循环
        s++; // 指针移动到下一个字符
    }
    return s - str; // 结束地址 - 起始地址 = 字符串长度
}
int main() {
    char text[] = "manual count";
    size_t length = my_strlen(text);
    printf("字符串是: \"%s\"\n", text);
    printf("手动计算的长度是: %zu\n", length);
    return 0;
}

输出:

字符串是: "manual count"
手动计算的长度是: 12

总结与最佳实践

操作 C++ C语言 (推荐方式) 说明
输入字符串 cin >> name; fgets(name, sizeof(name), stdin); fgets 更安全,能防溢出。
计算长度 name.length() strlen(name) strlen 是标准库函数,最常用。
注意事项 C++的 cin 也会遇到类似 scanf 的缓冲区问题,C++的 cin.getline() 更安全。 fgets 会保留换行符 \n,通常需要手动去除。

一个完整的、安全的C语言示例:

#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN 50
int main() {
    char user_name[MAX_NAME_LEN];
    // 1. 安全地输入字符串
    printf("请输入你的用户名 (最多 %d 个字符): ", MAX_NAME_LEN - 1);
    fgets(user_name, sizeof(user_name), stdin);
    // 2. 去除 fgets 读取的换行符
    user_name[strcspn(user_name, "\n")] = 0;
    // 3. 计算并打印字符串长度
    size_t name_length = strlen(user_name);
    printf("你的用户名是: \"%s\"\n", user_name);
    printf("用户名长度为: %zu\n", name_length);
    return 0;
}

在C语言中,请记住这个组合:

  • 输入用 fgets,因为它安全。
  • 长度用 strlen,因为它标准。
  • 处理输入时记得用 strcspn 去掉 \n,因为 fgets 会保留它。
-- 展开阅读全文 --
头像
织梦留言后台为何看不见?
« 上一篇 02-22
dede login空白是什么原因导致的?
下一篇 » 02-22

相关文章

取消
微信二维码
支付宝二维码

目录[+]