关于指针使用%c和%s输出的问题(语言-c语言)

img


不知道咋把代码写上去,提交的时候提示我说以下代码需使用代码控件

#前言
给个采纳哦!!
#分析
你这段代码本身存在问题
printf("%s", p); 会报错
error: redefinition of 'p' with a different type: 'int' vs 'char *'
error: conflicting types for 'printf'
第一个错误是因为在代码中定义了两个不同类型的变量名相同的变量。在代码中 char *p; 和 p=a; 在一起使用时,编译器会把 p 看成整型变量,从而导致这个错误。为了解决这个问题,可以将 char *p; 改为 char *p=NULL;,这样就明确指定了 p 的类型。
第二个错误则是因为在程序中使用了与系统库函数 printf() 相同名称的函数。这会导致编译器无法确定应该使用哪个函数,从而产生冲突。为了避免这种情况,建议使用不同名称的函数或者重命名函数。

改后代码如下 :


#include <stdio.h>

int main()
{
  char a[] = "ABCDEF";
  char *p = NULL;
  p = a;
  printf("%s", p);
  printf("%c", *p);
  return 0;
}

运行结果如下

img

第二个打印
printf("%c"p); 也不对 运行依旧报错
error: redefinition of 'p' with a different type: 'int' vs 'char '
这个错误是因为变量 p 已经在前面定义成了 char
类型,而这里又用 p=a 给它重新定义成了 int 类型,导致冲突。解决方法同上,将 char
p; 改为 char* p = NULL;。

error: expected parameter declarator
这个错误是因为在 printf() 函数调用中,缺少了参数的声明。正确的写法应该是 printf("%c", *p); 。

warning: incompatible redeclaration of library function 'printf' [-Wincompatible-library-redeclaration]
这个警告是由于程序中的 printf() 函数与系统库函数 printf() 重命名,导致冲突。为了避免这种情况,建议使用不同名称的函数或者重命名函数。

修改代码如下

#include <stdio.h>

int main()
{
    char a[] = "ABCDEF";
    char* p = NULL;
    p = a;
 
    printf("%c", *p);
 
    return 0;
}


运行结果如下:

img

指针使用%c和%s输出的问题

简单的总结一下 :
在 C 语言中,指针类型变量可以使用 %s%c 输出指向的字符串或字符。
使用 %s 输出字符串时,需要保证指针指向的内存空间是以 null 作为结尾的字符串。也就是说,指针所指向的最后一个字符要是 ASCII 码为 0 的字符,即 '\0'。这样,printf() 函数才能根据该字符自动确定字符串的结束位置。如果不满足这个条件,将无法正确输出字符串,甚至会导致程序崩溃。
使用 %c 输出字符时,需要使用指针解引用操作,即 *p,将指针所指向的值作为字符输出。因此,printf() 函数会输出指针所指向的内存空间的第一个字符。这里需要注意,如果指针所指向的是多个字符的数组,则只输出第一个字符。
当我们使用 %s%c 输出指针所指向的字符串或字符时,需要保证指针指向的内存空间是符合要求的,并且需要区分输出字符串和字符的不同情况

因为%s,需要char 或者char[],而%c需要char,所以只有p才匹配%c,p匹配%s

上面的代码,是在什么状态下得出的结论?上面的代码最终输出:ABCDEFA