【问题标题】:C: Trouble with StringsC:字符串问题
【发布时间】:2010-02-23 01:27:05
【问题描述】:

我是 C89 的新手,不太了解字符串的工作原理。我正在 Windows 7 上开发。

这是我正在尝试用 Java 做的事情:

String hostname = url.substring(7, url.indexOf('/'));

这是我在 C89 中的笨拙尝试:

// well formed url ensured
void get(char *url) {
    int hostnameLength;
    char *firstSlash;
    char *hostname;

    firstSlash = strchr(url + 7, '/');
    hostnameLength = strlen(url) - strlen(firstSlash) - 7;
    hostname = malloc(sizeof(*hostname) * (hostnameLength + 1));
    strncpy(hostname, url + 7, hostnameLength);
    hostname[hostnameLength] = 0; // null terminate
}

更新以反映答案

对于 14 个 hostnameLengthhostnamemalloc()'d 31 个字符。为什么会这样?

【问题讨论】:

  • @Rosarch,该代码不应该分配 31,它应该分配 15...您确定您显示的代码就是您正在运行的代码吗?你如何检查分配的大小?我刚刚运行并测试了您在这里的内容,并且得到了预期的结果。

标签: string c89


【解决方案1】:

// now what?strncpy()

hostname = malloc(hostnameLength + 1);
strncpy(hostname, url + 7, hostnameLength);
hostname[hostnameLength] = '\0'; // don't forget to null terminate!

【讨论】:

  • 我个人会使用memcpy。它更难搞砸,它不会做任何意想不到的事情。但是OP的代码确实需要检查strchr的返回值,目前还没有人提到。
  • @Chris,这取决于他是否在代码的其他地方保证了格式正确的 URL。
  • 我想使用你的malloc(),还是里德回答中描述的malloc()?你的是不是太小了?
  • @Rosarch,他们不完全一样吗?
【解决方案2】:

之后,你需要做:

hostname = malloc(sizeof(char) * (hostnameLength+1));
strncpy(hostname,  url + 7, hostnameLength);
hostname[hostnameLength] = 0;

有关复制的详细信息,请参阅strncpy。它确实需要提前分配目标指针(因此是 malloc),并且只会复制这么多字符...

【讨论】:

  • 你能解释一下hostname[hostnameLength] = 0;的意义吗?
  • 是的 - 你需要空终止主机名 - strncpy 将复制“主机名长度”字符,但它不会添加空终止字符。添加 0(或 '\0')将正确终止字符串。
  • C 字符串最后需要一个空字节,这涵盖了您正在复制的字符串不适合缓冲区的情况,因此 strncpy 没有将空字节放在上面。如果你不这样做,稍后的一些字符串操作会跑到随机内存中,程序可能会做各种奇怪的事情(虽然,诚然,它可能会因为分段错误而崩溃)。
  • sizeof(char)1。没有理由把它放在那里。
  • 我同意@Carl 的观点,但需要注意的是sizeof 在这里可能是可以接受的,但不是sizeof(char)sizeof(type) 创建了另一个地方,如果类型更改,维护人员必须更改代码(例如,charwchar_t)。 sizeof *hostname 会根据需要进行调整。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2017-09-18
  • 2016-06-11
  • 2011-11-24
相关资源
最近更新 更多