C语言经典例98-将字符转为大写字母并写入文件

本文介绍了一种使用C语言将输入字符串中的所有小写字母转换为大写字母,并将结果保存到磁盘文件的方法。通过观察ASCII码规律,将小写字母减32即可实现转换。

1 题目

从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。 输入的字符串以!结束。

2 分析

写入文件请参考上一篇文章 C语言经典例97-输入字符写入文件,对于字符串小写字母转换为大写字母有两种方法:

  1. 根据ASCII码来转换,观察ASCII码中大小字母和小写字母的规律可以发现,将小写字母-32则可以转换为相应的大写字母。
  2. 使用ctype.h中的函数toupper()tolower(),前者是转换为大写字母,后者是转换为小写字母。

本题采用第一种方法:

3 实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    FILE*fp = NULL;
    char str[100];
    printf("输入一个字符串:");
    gets(str);
    int len = strlen(str);
    for (int i = 0; i < len; i++) {
        if(str[i] <= 'z' && str[i] >= 'a') {
            str[i] -= 32; // 小写转大写
        }
    }
    if ((fp = fopen("test", "w")) == NULL) {
        printf("文件打开失败\n");
        exit(0);
    }
    fprintf(fp, "%s", str);
    fclose(fp);
    return 0;
}
在C语言中,可以通过指针遍历字符数组,检测句子首字母是否大写,删除多余的空格(包括句子中间的连续空格和尾部空格)。以下是实现步骤和代码: --- ### **功能需求** 1. **检测句子首字母大写**:如果句子的第一个字符是小写字母,则将其改为大写。 2. **删除多余空格**: -句子中间的连续空格为单个空格。 - 删除句子开头和结尾的空格。 --- ### **代码实现** ```c #include <stdio.h> #include <ctype.h> // 用于 isupper(), toupper() void process_sentence(char *str) { char *dest = str; // 写入指针 int space_flag = 0; // 标记是否遇到空格 // 1. 跳过开头的空格 while (*str == ' ') { str++; } // 2. 处理首字母大写 if (*str != '\0') { if (islower(*str)) { *str = toupper(*str); } *dest++ = *str++; // 写入首字母 } // 3. 遍历剩余字符,处理空格和有效字符 while (*str != '\0') { if (*str == ' ') { if (!space_flag) { *dest++ = ' '; // 只保留一个空格 space_flag = 1; } str++; } else { *dest++ = *str++; space_flag = 0; } } // 4. 确保字符串以 '\0' 结尾 *dest = '\0'; } int main() { char sentence[100]; printf("请输入一个句子: "); fgets(sentence, sizeof(sentence), stdin); // 读取输入(包括空格) process_sentence(sentence); printf("处理后的句子: %s\n", sentence); return 0; } ``` --- ### **代码说明** 1. **跳过开头空格**: - 使用 `while (*str == ' ')` 跳过字符串开头的所有空格。 2. **首字母大写**: - 使用 `islower()` 检测首字母是否为小写,如果是则用 `toupper()` 转换。 3. **处理多余空格**: - 用 `space_flag` 标记是否遇到空格,确保连续空格只保留一个。 4. **字符串结尾**: - 最后手动添加 `'\0'` 确保字符串正确终止。 --- ### **示运行** **输入**: ``` hello world! how are you? ``` **输出**: ``` Hello world! how are you? ``` --- ### **关键点** 1. **指针操作**: - `str` 是读取指针,`dest` 是写入指针,实现原地修改。 2. **空格处理逻辑**: - 遇到空格时,仅在 `space_flag == 0` 时写入空格。 3. **首字母大写**: - 直接修改字符串的第一个有效字符--- ### **扩展问题** 1. 如果输入是动态分配的字符串(如 `malloc`),如何调整内存大小? 2. 如何支持多语言(如 Unicode)的首字母大写检测? 3. 如果句子以标点符号开头(如 `"hello"`),如何跳过标点再大写首字母? 4. 如何统计删除的空格数量? 5. 如果字符串很长(如 1MB),如何优化性能?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值