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

时间:2017-12-28 07:16:16

标签: c string

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

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

3 个答案:

答案 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。它更便携。

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