1. 编写一个名为char.sh的脚本,功能如下(40分): a) 由用户输入一个字符串。 b) 统计字符串中字符的总个数、数字字符个数、大写字符的个数、小写字符的个数。最后输出相应结果。
时间: 2024-02-26 10:58:24 浏览: 13
好的,以下是 char.sh 的代码实现:
```bash
#!/bin/bash
echo "请输入一个字符串:"
read str
# 统计字符串中字符的总个数
char_num=${#str}
# 统计数字字符个数
digit_num=$(echo $str | sed 's/[^0-9]//g' | wc -c)
# 统计大写字符的个数
upper_num=$(echo $str | sed 's/[^A-Z]//g' | wc -c)
# 统计小写字符的个数
lower_num=$(echo $str | sed 's/[^a-z]//g' | wc -c)
echo "字符串中字符的总个数为:$char_num"
echo "数字字符个数为:$((digit_num-1))"
echo "大写字符的个数为:$((upper_num-1))"
echo "小写字符的个数为:$((lower_num-1))"
```
使用方法:
1. 将以上代码保存为 char.sh 文件;
2. 给 char.sh 文件添加执行权限:`chmod +x char.sh`;
3. 执行 char.sh 文件:`./char.sh`;
4. 根据提示输入字符串,即可输出相应结果。
注意事项:
1. 该脚本只能统计 ASCII 码中的字符,不支持 Unicode 字符;
2. 如果输入的字符串包含空格,需要用引号括起来,如:"hello world"。
相关问题
textBox1.Text = "8.34";如何使textbox1显示一个限定范围的随机数
你可以使用 C 语言的标准库函数 `rand()` 生成一个随机数,然后将其限定在一个指定的范围内,最后将其转换成字符串并赋值给 `textBox1.Text`。以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 设置随机数种子
int lower_bound = 1; // 下限
int upper_bound = 100; // 上限
int random_num = rand() % (upper_bound - lower_bound + 1) + lower_bound; // 生成随机数并限定在指定范围内
char str_num[20]; // 存储随机数的字符串数组
sprintf(str_num, "%d", random_num); // 将随机数转换成字符串
printf("%s\n", str_num); // 输出随机数的字符串形式
return 0;
}
```
你可以将上述代码中的 `printf("%s\n", str_num);` 改成 `textBox1.Text = str_num;`,即可将生成的随机数赋值给 `textBox1.Text`。
将Edvr.cfg文件解析为一个Config结构体
假设`Edvr.cfg`文件内容如下:
```
[General]
Version=1.0
Name=Edvr
[Parameters]
InputFile=input.mp4
OutputFile=output.mp4
FrameRate=30
```
可以通过以下步骤将`Edvr.cfg`文件解析为一个`Config`结构体:
1. 定义`Config`结构体,包含`General`和`Parameters`两个结构体。`General`结构体包含版本号和名称,`Parameters`结构体包含输入文件名、输出文件名和帧率。
```c
typedef struct {
struct {
float version;
char name[50];
} general;
struct {
char input_file[100];
char output_file[100];
int frame_rate;
} parameters;
} Config;
```
2. 编写解析函数,读取`Edvr.cfg`文件,并将读取的内容存储到`Config`结构体中。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Config parse_config_file(const char* file_name)
{
Config config = {0};
char line[100];
char section[20] = "";
FILE* fp;
fp = fopen(file_name, "r");
if (fp == NULL) {
printf("Failed to open file: %s\n", file_name);
return config;
}
while (fgets(line, sizeof(line), fp) != NULL) {
// 去除行末换行符
if (line[strlen(line) - 1] == '\n') {
line[strlen(line) - 1] = '\0';
}
// 处理段落信息
if (line[0] == '[' && line[strlen(line) - 1] == ']') {
strcpy(section, line + 1);
section[strlen(section) - 1] = '\0';
} else {
// 处理键值对信息
char* key = strtok(line, "=");
char* value = strtok(NULL, "=");
if (strcmp(section, "General") == 0) {
if (strcmp(key, "Version") == 0) {
config.general.version = atof(value);
} else if (strcmp(key, "Name") == 0) {
strncpy(config.general.name, value, sizeof(config.general.name) - 1);
config.general.name[sizeof(config.general.name) - 1] = '\0';
}
} else if (strcmp(section, "Parameters") == 0) {
if (strcmp(key, "InputFile") == 0) {
strncpy(config.parameters.input_file, value, sizeof(config.parameters.input_file) - 1);
config.parameters.input_file[sizeof(config.parameters.input_file) - 1] = '\0';
} else if (strcmp(key, "OutputFile") == 0) {
strncpy(config.parameters.output_file, value, sizeof(config.parameters.output_file) - 1);
config.parameters.output_file[sizeof(config.parameters.output_file) - 1] = '\0';
} else if (strcmp(key, "FrameRate") == 0) {
config.parameters.frame_rate = atoi(value);
}
}
}
}
fclose(fp);
return config;
}
```
上面的代码中,使用`fgets()`函数逐行读取`Edvr.cfg`文件的内容,然后根据行内容的不同,分别处理段落信息和键值对信息。具体来说:
- 如果行内容以方括号开头和结尾,说明这是一个段落信息,需要将方括号中的内容作为当前段落的名称。
- 如果行内容中包含等号,说明这是一个键值对信息,需要将等号左边的字符串作为键,等号右边的字符串作为值。根据当前段落的名称和键的名称,将值存储到`Config`结构体的相应字段中。
3. 调用解析函数,读取`Edvr.cfg`文件并打印配置信息。
```c
int main()
{
Config config;
config = parse_config_file("Edvr.cfg");
printf("General:\n");
printf("Version: %.1f\n", config.general.version);
printf("Name: %s\n", config.general.name);
printf("Parameters:\n");
printf("InputFile: %s\n", config.parameters.input_file);
printf("OutputFile: %s\n", config.parameters.output_file);
printf("FrameRate: %d\n", config.parameters.frame_rate);
return 0;
}
```
上面的代码中,调用`parse_config_file()`函数解析`Edvr.cfg`文件,并将解析结果存储到`config`结构体中。然后,打印`config`结构体中的各个字段。