首页 > 解决方案 > printf 以不同的方式表现...并获取地址和值....字符串的地址和指针仅在取消引用后

问题描述

printf正在获取字符串的地址而不是在取消引用后获取,而在指针的情况下需要取消引用。

#include <stdio.h>
#include<stdio.h>

int main()
{
    char str[100];
    int i;
    int j=0;
    int *p;

    p=&j;
    scanf("%s",str);
    for(i=0;str[i];i++)
    {
        if((str[i]>='A') && (str[i]<='Z'))
        {
            str[i]=str[i]+('a'-'A');
        }
        else
        {
            str[i]=str[i]-('a'-'A');
        }
    }
    printf("%s",str);   //it should have been printf("%s",*str); here we are  passing address
    printf("%d\n",j);
    printf("%d",*p);    //here we are passing evact value;

    return 0;
}

与它一起使用时*会崩溃,如果仅str使用它就可以正常工作...

标签: c

解决方案


%s格式说明符 to用于printf打印字符串,并需要一个char *指向以空字符结尾的字符数组的第一个元素的参数。格式说明%d符用于以十进制格式打印整数,并且需要int.

由于str是一个数组,当在表达式中使用时,它会衰减为指向其第一个元素的指针。所以str在一个表达式中有 type char *,它符合%s预期。

*str无效,%s因为它具有类型char并且具有数组中第一个字符的值。对给定参数使用错误的格式说明符会printf调用未定义的行为

*p是有效的,%d因为phas type int *,意思是*p有 type int,它符合%d预期。


推荐阅读