C语言给定一个单词s,统计其中各个字母出现的次数。 输入 输入一个字符串 s。 字符串s内不包含空格,s内字母均为小写。 输出 输出为出现次数不为0的字母出现多少次。 例: a出现5次,则 a=5。 样例输入 复制 str="apple"; 样例输出 复制 a=1 e=1 l=1 p=2 提示 【数据范围】 对于100%的数据,单词s长度<100000,s内字母均为小写。
时间: 2024-04-16 12:28:43 浏览: 112
你可以使用一个大小为26的数组来统计字母出现的次数,数组的下标对应字母的ASCII码减去97(即'a'的ASCII码)的值。首先将数组的所有元素初始化为0,然后遍历字符串s,每遇到一个字母就将对应的数组元素加1。遍历完成后,再遍历数组,输出出现次数不为0的字母及其出现次数。
以下是一个示例的C语言代码实现:
```c
#include <stdio.h>
#include <string.h>
int main() {
char s[100001];
int count[26] = {0}; // 初始化数组为0
scanf("%s", s);
int len = strlen(s);
for (int i = 0; i < len; i++) {
// 将对应字母的出现次数加1
count[s[i] - 'a']++;
}
for (int i = 0; i < 26; i++) {
if (count[i] != 0) {
// 输出出现次数不为0的字母及其出现次数
printf("%c=%d ", 'a' + i, count[i]);
}
}
return 0;
}
```
输入示例:
```
apple
```
输出示例:
```
a=1 e=1 l=1 p=2
```
相关问题
C语言给定一个字符串把其中各个单词的顺序颠倒,注意保持句首字母大写,标点符号不动。
可以使用以下步骤实现:
1. 定义一个函数,接受一个字符串参数,返回一个字符串结果。
2. 定义一个数组,存储每个单词的起始位置和长度。
3. 遍历字符串,找到每个单词的起始位置和长度,并将其存储到数组中。
4. 遍历数组,将每个单词反转。
5. 遍历数组,将每个单词的首字母大写。
6. 遍历数组,将每个单词连接起来,中间加上空格。
下面是实现该函数的代码:
```c
#include <ctype.h>
#include <string.h>
char* reverseWords(char* s) {
int len = strlen(s);
int words[100][2];
int count = 0;
int i = 0;
while (i < len) {
while (i < len && isspace(s[i])) i++;
if (i == len) break;
words[count][0] = i;
while (i < len && !isspace(s[i])) i++;
words[count][1] = i - words[count][0];
count++;
}
for (int i = 0; i < count; i++) {
int start = words[i][0];
int end = words[i][0] + words[i][1] - 1;
while (start < end) {
char tmp = s[start];
s[start] = s[end];
s[end] = tmp;
start++;
end--;
}
}
for (int i = 0; i < count; i++) {
int idx = words[i][0];
s[idx] = toupper(s[idx]);
}
char* result = malloc(len + 1);
memset(result, 0, len + 1);
for (int i = 0; i < count; i++) {
int start = words[i][0];
strncat(result, s + start, words[i][1]);
if (i < count - 1) strcat(result, " ");
}
return result;
}
```
注意,该函数返回的字符串需要手动释放。可以这样调用:
```c
char* s = "Hello, world!";
char* result = reverseWords(s);
printf("%s\n", result);
free(result);
```
统计给定字符串中各单词出现的次数,具体要求如下: 接收给定的一行字符串(如:hello hi ask hi); 切割字符串,统计字符串中各单词出现的次数,并输出结果。 注意:字符串中各单词之间间隔一个空格。用C语言
在C语言中,你可以使用标准库函数`strtok()`来进行字符串分割,并结合`hash_map`(类似于C++中的`std::map`)数据结构来统计单词出现的次数。以下是一个简单的示例:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char* word;
int count;
} WordCount;
// 自定义哈希表,用于存储单词及其计数
typedef struct {
WordCount* table[256]; // 使用ASCII字符作为键,这里假设最多只有一个字母长度的单词
} WordBucket;
// 计算并更新单词计数
void increment_count(WordBucket* bucket, char* word) {
for (int i = 0; word[i] != '\0'; ++i) {
if (!bucket[word[i]]) {
bucket[word[i]] = (WordCount*)malloc(sizeof(WordCount));
bucket[word[i]]->word = word;
bucket[word[i]]->count = 1;
} else {
bucket[word[i]]->count++;
}
}
}
// 分割字符串并统计单词
void count_words(char* str, WordBucket* bucket) {
char* token = strtok(str, " ");
while (token != NULL) {
increment_count(bucket, token);
token = strtok(NULL, " ");
}
}
// 输出结果
void print_word_counts(WordBucket* bucket) {
for (char* key = "abcdefghijklmnopqrstuvwxyz"; key[0] <= 'z'; ++key) {
if (bucket[key]) {
printf("%s: %d\n", key, bucket[key]->count);
}
}
}
int main() {
char str[] = "hello hi ask hi";
WordBucket bucket;
memset(bucket.table, 0, sizeof(bucket.table));
count_words(str, &bucket);
print_word_counts(&bucket);
return 0;
}
```
这个程序首先初始化一个`WordBucket`结构,然后遍历输入字符串,将每个单词添加到哈希表中并计算其计数。最后,它会打印出所有统计过的单词及其出现次数。
阅读全文