【问题标题】:C Strings, Pointers, PutsC 字符串、指针、放置
【发布时间】:2016-06-08 07:18:14
【问题描述】:

我最近一直在研究 C 语言编程的代码。我在处理二维字符串和指针时被困在这里。函数 printf()、putchar() 和 puts() 也令人困惑!请帮我解决以下sn-p:

#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;
}

我想知道为什么*(ptr+1)(ptr+1) 都对printf 起作用,而(ptr+1)puts 给出错误。我也知道putchar 接受一个整数参数。为什么我们在这里使用双指针?

【问题讨论】:

  • 使用%p打印指针
  • 另外,我要求您重新阅读手册页并仔细检查提供的数据类型。 :)
  • “给出错误”:哪个错误?
  • 我已经尝试过您在 gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1) 中提到代码 sn-p 并且在编译时或运行时我没有看到任何错误。
  • [错误] 无法将参数 '1' 的 'char ()[4]' 转换为 'const char' 到 'int puts(const char*)'跨度>

标签: c string printf getchar puts


【解决方案1】:

您的ptr 变量的类型为char (*)[4](指向char 数组的指针)。 puts的原型是:

int puts(const char *s);

因此,正如您的编译器可能所说,puts 需要一个指向 char 的指针,但您给出的参数类型为 char (*)[4]

我想知道为什么 *(ptr+1) 和 (ptr+1) 都对 printf 有效,而 (ptr+1) 对 puts 出错。

在调用printf 时不检查参数类型(可能是因为printf 采用可变参数)。在您的 CFLAGS 中添加 -Wall 以添加更多警告,您的编译器应该发出警告。

我也知道 putchar 接受一个整数参数。为什么我们在这里使用双指针?

您取消引用ptr 两次以获得char(您也可以使用(*ptr)[1])。当您调用 putchar 时,此 char 会隐式转换为 int

【讨论】:

  • char * [4] 是一个包含 4 个字符指针的数组,char (*) [4] 是一个指向 4 个字符数组的指针。
  • 这帮助并带来了一些清晰性。谢谢。
  • 如果在调用 printf 时没有检查参数,那么如何(何时)决定输出?还有怎么可能同时接受 const * char 和 char 类型的参数?
  • 编译器不检查参数。输出在运行时决定,格式字符串由printf函数解析。
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多