我编写了代码,用于将用户输入的字符串转换为小写,以两种方式。
//method 1:
void xstrlwr(char*p)
{
while(*p!='\0')
{
if(*p>=65&&*p<=90)
{
*p=*p+32;
}
p++;
}
printf("%s",p);
}
和
//method 2:
void xstrlwr(char*p)
{
int l,i;
l=strlen(p);
for(i=0;i<=l;i++)
{
if(p[i]>=65&&p[i]<=90)
{
p[i]=p[i]+32;
}
}
printf("\n%s",p);
}
这是预期的输出
Input : WElcome TO sTack OverFLow
Expected output: welcome to stack overflow
代码1未正确运行(打印字符串有空输出), 而代码2运行完美(它输出小写字符串)。 所以我的问题是为什么第一个输出为空,尽管两个代码在逻辑上是相同的,只是有不同的符号?
由于指针指向NUL终结符,因此第一个片段中的printf
不会打印任何内容。 (注意在该片段中使用p++
。)
在第二个片段中,您不会更改传递给函数的参数,因此p
仍然指向字符串的开头。
两个功能的“胆量”是相同的,虽然我更喜欢第一个。这里的故事的寓意是在函数调用站点打印结果,而不是在函数本身。
最后请注意,任一算法仅适用于使用ASCII(或近亲)进行字符编码的平台。出于这个原因,C标准库提供tolower
来完成这项工作。
两个代码在逻辑上相同,只是有不同的符号?
事实并非如此。在方法2中,指针p
从未改变。在循环结束时,它仍然指向字符串的开头。并且在循环结束后的method1中,p
指向\0
,输入字符串的空终止符(因为p++
)。您可以创建p
的副本来修复它。
void xstrlwr(char*p)
{
char *q = p; // A copy
while(*p!='\0')
{
if(*p>=65&&*p<=90)
{
*p=*p+32;
}
p++;
}
printf("%s",q); // q not p
}
也许这只是一个使用ASCII的练习,但如果没有,你应该真的使用tolower()而不是bit-banging。它更便携。
编辑:作为一个评论,这本来会更好,因为它更像是一个旁观/观察而不是问题的答案。