C语言字符串大小写转换代码优化:解决数组长度获取错误
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)实际上是指针的大小,而不是数组的大小。因此,这个表达式的结果将始终是指针的大小除以字符的大小,通常是一个较小的固定值。
解决方案
为了解决这个问题,我们可以采用两种方法:
- 传递数组长度作为参数:在函数
upperCase中添加一个参数来接收数组的长度,例如: - 使用
strlen函数:可以使用strlen函数来获取字符串的长度,例如:
void upperCase(char str[], int length)
{
int step = 'a' - 'A';
for(int i = 0; i < length; i++)
{
if(islower(str[i]))
str[i] -= step;
}
}
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 著作权归作者所有。请勿转载和采集!