Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C字符串、指针、Puts_C_String_Printf_Getchar_Puts - Fatal编程技术网

C字符串、指针、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

最近我一直在研究一个关于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 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
函数解析。