C字符串、指针、Puts
最近我一直在研究一个关于C语言编程的代码。我在处理二维字符串和指针时被困在这里。此外,printf()、putchar()和puts()函数令人困惑!请用以下代码片段帮助我:C字符串、指针、Puts,c,string,printf,getchar,puts,C,String,Printf,Getchar,Puts,最近我一直在研究一个关于C语言编程的代码。我在处理二维字符串和指针时被困在这里。此外,printf()、putchar()和puts()函数令人困惑!请用以下代码片段帮助我: #include<stdio.h> int main() { char wer[3][4]= {"bag", "let", "bud"}; char (*ptr)[4]=wer; printf("%d %d %d\n",ptr, ptr+1, ptr+1); // points
#include<stdio.h>
int main()
{
char wer[3][4]= {"bag", "let", "bud"};
char (*ptr)[4]=wer;
printf("%d %d %d\n",ptr, ptr+1, ptr+1); // points to bag, let and bud respectively
printf("%d %d %d\n",wer, wer+1, wer+1); // points to bag, let and bud respectively
printf("%d %d %d\n", (*ptr), (*ptr+1), (*ptr +2)); // points to b,a,g respectively
printf("%s\n",*(ptr+1)); //prints let
printf("%s\n", (ptr+1)); //prints let
printf("%s\n", (*ptr +1)); //prints ag
puts(*(ptr+1)); //prints let
//puts((ptr+1)); //gives error
puts((*ptr+1)); //prints ag
putchar(**(ptr+1));//prints l
putchar(*(*ptr +1));//prints a
return 0;
}
#包括
int main()
{
charwer[3][4]={“bag”、“let”、“bud”};
字符(*ptr)[4]=wer;
printf(“%d%d%d\n”,ptr,ptr+1,ptr+1);//分别指向bag、let和bud
printf(“%d%d%d\n”,wer,wer+1,wer+1);//分别指向bag、let和bud
printf(“%d%d%d\n”,(*ptr),(*ptr+1),(*ptr+2));//分别指向b、a、g
printf(“%s\n”,*(ptr+1));//prints let
printf(“%s\n”,(ptr+1));//prints let
printf(“%s\n”,(*ptr+1));//prints ag
put(*(ptr+1));//打印let
//puts((ptr+1));//给出错误
puts((*ptr+1));//打印ag
putchar(**(ptr+1));//打印l
putchar(*(*ptr+1));//打印
返回0;
}
我想知道为什么
*(ptr+1)
和(ptr+1)
都适用于printf
,而(ptr+1)
给出了put
的错误。我还知道,putchar
接受整数参数。为什么我们在这里使用双指针 您的ptr
变量的类型为char(*)[4]
(指向char
数组的指针)。put
的原型是:
int puts(const char *s);
因此,正如您的编译器可能所说,put
需要一个指向char
的指针,但您给出的参数类型为char(*)[4]
我想知道为什么*(ptr+1)和(ptr+1)都适用于printf,而(ptr+1)为put提供了一个错误
调用printf
时未检查参数类型(可能是因为printf
采用可变参数)。在您的CFLAGS
中添加-Wall
,以添加更多警告,并且您的编译器应该发出有关此的警告
我还知道putchar接受一个整数参数。为什么我们在这里使用双指针
您可以取消引用
ptr
两次以获得char
(您也可以执行(*ptr)[1]
)。调用putchar时,此char
隐式转换为int
。使用%p
打印指针。此外,我要求您重新阅读手册页并仔细检查提供的数据类型。:)“给出一个错误”:哪个错误?我试过gcc版本4.8.4(Ubuntu4.8.4-2ubuntu1~14.04.1)中的代码段,在编译时或运行时我没有看到任何错误。[错误]无法将参数“1”的“char()[4]”转换为“const char”到“int puts(const char*)”char*[4]
是一个由4个字符指针组成的数组,char(*)[4]
是一个指向4个字符数组的指针。这有助于并带来了一些清晰度。谢谢。如果在调用printf时没有检查参数,那么如何(何时)决定输出?另外,如何接受const*char和char类型的参数,这两种参数都不由编译器检查。输出在运行时决定,格式字符串由printf
函数解析。