手动输入字符串并获取长度
时间: 2023-09-06 08:14:43 浏览: 51
要手动输入字符串并获取其长度,你可以使用`std::cin`来接收用户输入,并使用`strlen()`来计算字符串的长度。下面是一个示例代码:
```cpp
#include <iostream>
#include <cstring>
int main() {
const int MAX_SIZE = 100; // 字符串的最大长度
char str[MAX_SIZE];
std::cout << "请输入一个字符串: ";
std::cin.getline(str, MAX_SIZE); // 接收用户输入的字符串
int length = strlen(str);
std::cout << "字符串长度为: " << length << std::endl;
return 0;
}
```
运行这段代码,程序会提示你输入一个字符串。输入完成后,它将输出该字符串的长度。注意,我们在声明字符数组`str`时,指定了最大长度为`MAX_SIZE`,你可以根据需要调整该值。
相关问题
c语言中如何输入带有空格字符串
在 C 语言中,可以使用 `fgets()` 函数来读取带有空格的字符串,示例如下:
```
char str[100];
printf("请输入字符串:");
fgets(str, sizeof(str), stdin);
```
这里的 `fgets()` 函数会读取用户输入的整行字符串,包括其中的空格,最后将其存储到 `str` 数组中。需要注意的是,`fgets()` 函数会读取换行符,因此如果需要去掉字符串末尾的换行符,可以使用 `strtok()` 函数或者手动替换的方式,例如:
```
// 使用 strtok() 函数去掉换行符
char *pos;
if ((pos = strchr(str, '\n')) != NULL) {
*pos = '\0';
}
// 手动替换换行符
int len = strlen(str);
if (len > 0 && str[len - 1] == '\n') {
str[len - 1] = '\0';
}
```
其中,`strchr()` 函数用于查找字符串中指定字符的位置,`strlen()` 函数用于获取字符串长度。
使用线程互斥锁实现以下功能:主线程和子线程共享一个字符数组作为数据存储区,子 线程接收来自键盘输入的字符串,主线程中读取字符串并输出字符串和字符串的长度。 当主 线程判断收到 end 字符串,则结束程序 。
下面是使用线程互斥锁实现的代码示例:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <cstring>
using namespace std;
const int MAX_LEN = 100; // 字符数组最大长度
char data[MAX_LEN]; // 数据存储区
mutex data_mutex; // 互斥锁
bool end_flag = false; // 结束标志
// 子线程函数:接收键盘输入的字符串
void input_thread_func()
{
while (true)
{
string s;
getline(cin, s); // 从键盘读入一行字符串
{
lock_guard<mutex> lock(data_mutex); // 获取互斥锁
if (s == "end")
{
end_flag = true; // 若输入字符串为 "end",则设置结束标志并退出循环
break;
}
else
{
strncpy(data, s.c_str(), MAX_LEN); // 将输入字符串复制到数据存储区
}
}
}
}
// 主线程函数:读取字符串并输出字符串和字符串的长度
void output_thread_func()
{
while (true)
{
{
lock_guard<mutex> lock(data_mutex); // 获取互斥锁
if (end_flag) // 若已经设置结束标志,则退出循环
{
break;
}
else
{
cout << "Received string: " << data << endl; // 输出字符串
cout << "String length: " << strlen(data) << endl; // 输出字符串长度
}
}
this_thread::sleep_for(chrono::milliseconds(100)); // 休眠 100 毫秒,避免输出过快
}
}
int main()
{
thread input_thread(input_thread_func); // 创建子线程
thread output_thread(output_thread_func); // 创建主线程
input_thread.join(); // 等待子线程结束
output_thread.join(); // 等待主线程结束
return 0;
}
```
在上面的代码中,我们定义了一个全局的字符数组 `data` 作为数据存储区,一个互斥锁 `data_mutex` 用于保护该数据存储区的访问,以及一个结束标志 `end_flag`。首先,我们创建一个子线程 `input_thread`,在该线程中不断循环读取键盘输入的字符串,并将其复制到数据存储区中。当输入的字符串为 "end" 时,设置结束标志并退出循环。接着,我们创建一个主线程 `output_thread`,在该线程中不断循环读取数据存储区中的字符串,并输出字符串和字符串的长度。当结束标志被设置时,退出循环,程序结束。
需要注意的是,在读取和写入数据存储区时,必须先获取互斥锁,以保证线程安全。在上面的代码中,我们使用了 `lock_guard` 类来自动获取和释放互斥锁,避免了手动调用 `lock()` 和 `unlock()` 函数的麻烦。此外,在输出字符串和字符串长度后,我们使用了 `this_thread::sleep_for()` 函数来休眠一段时间,避免输出过快导致界面混乱。