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

您的问题可以理解为两个部分:
- C语言中如何输入一个字符串? (对应C++的
cin) - C语言中如何计算一个字符串的长度?
下面我将分步为您详细解释。
第一部分:C语言中如何输入字符串?(C语言的 cin)
在C语言中,主要有两种安全的方式(以及一种不安全但常见的方式)来输入字符串。
使用 scanf (简单但不安全)
scanf 函数可以用来读取输入,但它有一个很大的缺点:它不知道缓冲区有多大,容易导致缓冲区溢出,从而引发程序崩溃或安全漏洞。

语法:
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 数组,这会覆盖掉数组后面的内存空间,导致不可预测的错误。

使用 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会保留它。
