我编写了一些代码,用于将用户输入的字符串转换为小写字母,用两种方式。
//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运行完美(它输出小写字符串)
所以我的问题是为什么第一个输出为空,尽管两个代码在逻辑上是相同的,只是有不同的符号?
答案 0 :(得分:3)
由于指针指向NUL终结符,因此第一个代码段中的printf
不会打印任何内容。 (请注意在该代码段中使用p++
。)
在第二个片段中,您不会更改传递给函数的参数,因此p
仍然指向字符串的开头。
两种功能的“胆量”是相同的,尽管我更喜欢第一种。这里故事的寓意是在函数调用站点打印结果,而不是在函数本身打印。
最后请注意,任一算法仅适用于使用ASCII(或近亲)进行字符编码的平台。因此,C标准库提供tolower
来完成这项工作。
答案 1 :(得分:2)
这两个代码在逻辑上是相同的,只是有不同的符号?
事实并非如此。在方法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
}
答案 2 :(得分:0)
也许这只是玩ASCII的练习,但如果没有,你应该真正使用tolower()而不是bit-banging。它更便携。
编辑:这可以作为评论更好,因为它更像是一个旁观/观察而不是问题的答案。