【问题标题】:Character pointer and strings字符指针和字符串
【发布时间】:2017-11-18 16:56:04
【问题描述】:

专家们在“Let us C”一书中提出了一个问题,作者要求编写给定程序的输出。 该程序是-

#include<stdio.h>
int main()
{
    char s[]="Churchgate: no church no gate";
    char t[40];
    char *ss,*tt;
    ss=s;
    while(*ss!='\0')
        *tt++=*ss++;
    printf("%s\n",t);
    return 0;
}

当我在我的 gcc 编译器上尝试它时,输出被核心转储了。请解释原因。这里 ss 和 tt 是字符指针。 这里我也不明白 ss=s; 语句是什么意思 我的意思是我们不能直接复制字符串,除非我们逐个字符地复制它。 ss 是一个字符指针,所以它指向一个字符,那么 ss=s 是什么意思?这是否意味着它将指向地址为s的ASCII值的字节? 我也不明白这个说法*tt++=*ss++。我对此一无所知。请详细说明其含义。

接下来我不明白为什么 printf("%s\n",t) 被用作 t 是字符类型但它没有根据程序存储任何内容。

【问题讨论】:

  • tt 没有指向任何地方......
  • 也许你想要tt=t;然后在最后*tt='\0'
  • 另外,缩进:(
  • 此处的“警告”部分:stackoverflow.com/questions/562303/… 对您正在阅读的书说以下内容:It is a horribly outdated book that teaches Turbo C and has lot of obsolete, misleading and downright incorrect material.
  • 注意:不会使用 ASCII。文字字符串由编译器使用execution character set 编码。 -fexec-charset.

标签: c string char char-pointer


【解决方案1】:

首先要做的事' 数组名只不过是保存第一个元素地址的指针。 所以,

char s[]="Churchgate: no church no gate";

这里 s 是指针名称。它保存字符串的“C”地址。 现在您已经声明了另一个也是字符类型的指针,即 ss。

所以,ss=s;表示 ss 也持有 s 持有的地址。

因为你没有存储任何东西到 t 所以它会打印垃圾。同样,指针 tt 最初不存储任何地址(垃圾)。 最后也是最重要的 你不能执行这个操作: *tt++=*ss++; 可能会显示所需的左值错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2015-02-22
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多