C语言字符串大小写转换代码优化:解决数组长度获取错误

本文将分析一段C语言代码,该代码用于将字符串转换为大写字母,并指出其中存在的问题:在函数`upperCase`中,`sizeof(str)/sizeof(str[0])`并不能正确获取数组`str`的长度。我们将提供解决方案,并给出改进后的代码。

原始代码

#include <stdio.h>
#include <limits.h>
#include <ctype.h>

void upperCase(char str[]) { int step = 'a' - 'A'; //得到大写字母与小写字母间的ASCII码差值 for(int i = 0; i<sizeof(str)/sizeof(str[0]); i++)
{ if(islower(str[i])) str[i] -= step; } } int main(void) { char str[] = "abcdefghijklnmopqrstuvwxyz"; printf("原数组:%s\n", str); upperCase(str); printf("转换后:%s\n", str); }

问题分析

代码中存在一个问题:在函数upperCase中,sizeof(str)/sizeof(str[0])并不能正确获取数组str的长度。这是因为在函数中,数组参数会退化为指针,sizeof(str)实际上是指针的大小,而不是数组的大小。因此,这个表达式的结果将始终是指针的大小除以字符的大小,通常是一个较小的固定值。

解决方案

为了解决这个问题,我们可以采用两种方法:

  1. 传递数组长度作为参数:在函数upperCase中添加一个参数来接收数组的长度,例如:
  2. void upperCase(char str[], int length)
    {
    int step = 'a' - 'A';
    for(int i = 0; i < length; i++)
    {
    if(islower(str[i]))
    str[i] -= step;
    }
    }
    
  3. 使用strlen函数:可以使用strlen函数来获取字符串的长度,例如:
  4. void upperCase(char str[])
    {
    int step = 'a' - 'A';
    int length = strlen(str);
    for(int i = 0; i < length; i++)
    {
    if(islower(str[i]))
    str[i] -= step;
    }
    }
    

改进后的代码

以下是使用strlen函数改进后的代码:

#include <stdio.h>
#include <limits.h>
#include <ctype.h>
#include <string.h>

void upperCase(char str[]) { int step = 'a' - 'A'; int length = strlen(str); for(int i = 0; i < length; i++) { if(islower(str[i])) str[i] -= step; } } int main(void) { char str[] = "abcdefghijklnmopqrstuvwxyz"; printf("原数组:%s\n", str); upperCase(str); printf("转换后:%s\n", str); }

总结

本文分析了C语言字符串大小写转换代码中使用sizeof获取数组长度的错误,并提供了两种解决方案:传递数组长度作为参数或使用strlen函数获取字符串长度。建议在处理字符串时,尽量使用strlen函数来获取字符串的长度,以避免类似问题。</


原文地址: https://www.cveoy.top/t/topic/pOj3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录