删除字符串中标点符号和多余空格,用c语言编写程序
时间: 2024-12-15 20:17:53 浏览: 73
在C语言中,删除字符串中的标点符号和多余空格通常涉及到遍历字符串,并对字符逐个检查是否需要保留。这里我们可以使用ASCII码表来判断字符是否属于标点符号或空格。以下是一个简单的实现示例:
```c
#include <stdio.h>
#include <ctype.h> // 包含用于处理字符的库函数
// 功能:删除字符串中的标点符号和多余空格
void remove_punctuation_and_spaces(char *str) {
int i, j;
for (i = 0, j = 0; str[i] != '\0'; i++) { // 遍历字符串
if (!ispunct(str[i]) && !isspace(str[i])) { // 检查非标点和非空格字符
str[j++] = str[i]; // 保留并移动到新位置
}
}
str[j] = '\0'; // 结束字符串
}
int main() {
char str[100];
printf("请输入字符串:");
fgets(str, sizeof(str), stdin); // 从用户输入获取字符串
remove_punctuation_and_spaces(str);
printf("处理后的字符串:%s\n", str);
return 0;
}
```
相关问题
用C语言处理字符串 编写程序以字符串为单位,以空格或标点符号(字符串中仅含,或作为标点符号)作为分隔符,对字符串中所有单词进行倒排,之后把已处理的字符串(应不含标点符号)打印出来。
在C语言中,处理字符串并实现倒序操作可以使用以下步骤:
1. 分割字符串成单词数组:我们使用`strtok()`函数将字符串按指定的分隔符分割。
2. 倒序数组:创建一个新的数组来存放倒序后的单词,并使用循环反向填充。
3. 拼接倒序后的字符串:最后将处理过的单词连接成新的字符串。
下面是一个简单的示例程序:
```c
#include <stdio.h>
#include <string.h>
void reverse_words(char *input_str, char delimiter, char *output) {
// 分割输入字符串到单词数组
char *word = strtok(input_str, delimiter);
int word_count = 0;
// 计算单词数量
while (word != NULL) {
word_count++;
word = strtok(NULL, delimiter);
}
// 创建新数组存储倒序后的单词
char *reversed_words = (char *)malloc(sizeof(char) * (word_count + 1)); // 加1防止越界
reversed_words[word_count] = '\0';
// 倒序填充单词
for (int i = word_count - 1; i >= 0; i--) {
strcat(reversed_words, word);
reversed_words[i + 1] = delimiter;
}
// 删除最后一个多余的分隔符
reversed_words[strlen(reversed_words) - 1] = '\0';
// 输出处理后的字符串
printf("%s\n", output); // 可以在这里修改为直接赋值给实际的输出指针
free(reversed_words); // 释放内存
}
int main() {
char input[] = "Hello, world! This is a test.";
char output[100]; // 假设输出的最大长度为99
reverse_words(input, " ", output); // 使用空格作为分隔符
return 0;
}
```
用c语言,编写程序以字符串为单位,以空格或标点符号(字符串中仅含,或'.'作为标点符号)作为分隔符,对字符串中所有单词进行倒排,之后把已处理的字符串(应不含标点符号)打印出来。
在C语言中,你可以通过以下几个步骤实现这个功能:
1. 首先,我们需要创建一个函数,用于分割输入的字符串并移除标点符号。可以使用`isalnum()`函数判断字符是否为字母或数字。
2. 然后,我们将字符串分解成单词数组,并计算每个单词出现的次数,可以使用哈希表存储。
3. 接着,将单词按照频率从高到低排序。这里我们可以用快速选择算法或者外部排序,因为数据量不大,简单的冒泡排序或插入排序也是可行的。
4. 最后,生成倒序排列的单词字符串。
下面是一个简单的示例代码实现,注意此代码未包含完整的排序部分,因为它涉及到更复杂的算法或数据结构:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
// 哈希表存储单词及其频率
typedef struct {
char* word;
int freq;
} WordInfo;
// 分割字符串并去除非字母数字字符
void split_string(char* str, WordInfo** words, int* count) {
*count = 0;
WordInfo* arr = (WordInfo*)malloc(sizeof(WordInfo)*50); // 假设最多50个单词
char* token = strtok(str, " .,");
while (token != NULL) {
if (isalnum(token[0])) {
*arr[*count].word = token;
for (int i = 0; i < strlen(*arr[*count].word); i++) {
*arr[*count].word[i] = tolower(*arr[*count].word[i]); // 转换为小写
}
(*arr[*count]).freq = 1;
(*count)++;
}
token = strtok(NULL, " .,");
}
*words = arr;
}
// 临时排序函数,简化版本,实际应用中需要改进
void quicksort(WordInfo* arr, int low, int high) {
// 实现快速排序代码...
}
int main() {
char str[] = "Hello, world! This is a test string.";
WordInfo* words = NULL;
int word_count = 0;
split_string(str, &words, &word_count);
// 对单词排序,这里省略了排序部分
// quicksort(words, 0, word_count - 1);
// 打印倒序单词
for (int i = word_count - 1; i >= 0; i--) {
printf("%s ", words[i].word);
}
free(words);
return 0;
}
```
阅读全文
相关推荐
















