2011-10-03 65 views
0

将大写更改为小写可以缩短字符串的长度吗?将大写更改为小写可以缩短字符串的长度吗?

void lower(char *s) 
{ 
    int i; 
    for (i=0;i<strlen(s);i++) 
    if(s[i])>='A' && s[i]<='Z') 
     s[i]-=('A'-'a'); 
} 
+0

这是什么问题?是否将字符串更改为小写字母可以缩短字符串*(通常取决于编码和可能的语言环境),还是缩短字符串的长度? – jalf

+0

你应该使用std :: tolower来代替;与你的代码是很明显的:你不改变它,所以长度保持不变:) – sehe

+0

如果你使用的是C++,那么你应该使用'std :: string','tolower'等,并移动到更高抽象级别。 –

回答

1

如果您只是将另一个字符替换为另一个字符,与您一样,则生成的字符串仍然具有相同的大小。类型char总是被定义为C或C++中的一个字节。

2

不,不应该。

其他需要注意以下几点:

  1. 你在循环的每个迭代计算strlen,尝试将其保存到一个变量
  2. 您认为该字符串是正确空值终止的;你会溢出,如果它不是
+0

你打算如何稳定这个循环以避免缺失零终止?对不起,如果这听起来很愚蠢,但我真的没有办法。 – thiton

+0

我能想到的唯一安全方法是改变API:'lower(char * s,size_t maxlen)'。这要求周围的代码使用类似的有界的字符串函数,例如。 'strncpy'而不是'strcpy'。没有这个假设,我也没有看到任何方式。 – orip

+0

1.让编译器负责优化。 –

2

因为你在ASCII工作,不,你显然是做1对1替换。您是否应该更改代码以支持UTF-8:也许。

-1

此代码不会更改字符串的长度。但有问题与代码:计算strlen()每次迭代,这是多余的。 将结果存储在变量中并在循环中使用它

+0

第二点是错误的。 –

+0

@DavidHeffernan,我搞砸了。现在编辑。 – iammilind

0

如果正确完成 ,更改字符串的大小写可能会更改长度。例如,在德语中,两个字符串“SS” 在某些上下文中变成单字符串“ß”(但不在 其他中,例如:“STRASSE” - >“Straße”,但“GASSE” - > “Gasse”)。正确更改 的情况肯定不是微不足道的,而且非常区分的 具体。标准中没有真正的支持。

您发布不会改变长度,但随后,它从 远远正确的代码:根据编码,它可能会改变一些非字母 字符以及(拼音并不总是连续的),和它会 肯定无法转换一些字母字符,例如'Ä','Ö'和 'Ü'用瑞典语。

相关问题