处理指向字符串的指针后为什么空输出?

问题描述 投票:2回答:3

我编写了代码,用于将用户输入的字符串转换为小写,以两种方式。

//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运行完美(它输出小写字符串)。 所以我的问题是为什么第一个输出为空,尽管两个代码在逻辑上是相同的,只是有不同的符号?

c string
3个回答
3
投票

由于指针指向NUL终结符,因此第一个片段中的printf不会打印任何内容。 (注意在该片段中使用p++。)

在第二个片段中,您不会更改传递给函数的参数,因此p仍然指向字符串的开头。

两个功能的“胆量”是相同的,虽然我更喜欢第一个。这里的故事的寓意是在函数调用站点打印结果,而不是在函数本身。

最后请注意,任一算法仅适用于使用ASCII(或近亲)进行字符编码的平台。出于这个原因,C标准库提供tolower来完成这项工作。


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
}

0
投票

也许这只是一个使用ASCII的练习,但如果没有,你应该真的使用tolower()而不是bit-banging。它更便携。

编辑:作为一个评论,这本来会更好,因为它更像是一个旁观/观察而不是问题的答案。

© www.soinside.com 2019 - 2024. All rights reserved.