鱼C论坛

 找回密码
 立即注册
查看: 324|回复: 3

[已解决]《C语言程序设计现代方法》字符串课后作业问题

[复制链接]
发表于 2024-2-8 18:52:55 | 显示全部楼层 |阅读模式
60鱼币
  1. #include <stdio.h>
  2. #include <string.h>

  3. #define LEN 40

  4. void build_index_url (const char *domain, char *index_url);

  5. int main(void)
  6. {
  7.         char domain[LEN] = {0}, index_url[LEN] = {0};

  8.         printf ("Enter a URL: ");
  9.         scanf ("%s", domain);

  10.         build_index_url(domain, index_url);

  11.         puts(index_url);

  12.         return 0;
  13. }

  14. void build_index_url (const char *domain, char *index_url)
  15. {
  16.         char *http = "http://www.";
  17.         char *html = "/index.html";
  18. /*      strcat(http, domain);
  19.         strcat(http, html);
  20.         strcpy(index_url, http);
  21. */

  22.         strcpy(index_url, strcat(strcat(http, domain), html));
  23. }
复制代码


gdb看,第一个 strcat 一调用就出错了,请问问题在哪啊?
最佳答案
2024-2-8 18:52:56
问题出在`char *http = "http://www.";`这行代码上。你声明的`http`是一个指向字符串常量的指针,它指向的是只读内存区域。当你尝试使用`strcat`函数拼接字符串时,这将导致未定义的行为。

要解决这个问题,你可以将`http`声明为一个字符数组,并初始化为包含所需字符串的空间大小。例如,可以修改代码如下:

  1. char http[LEN] = "http://www.";
复制代码


此外,你还需要注意`domain`和`index_url`的声明方式。它们应该是字符数组而不是字符变量。修改代码如下:

  1. char domain[LEN] = {0}, index_url[LEN] = {0};
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

最佳答案

查看完整内容

问题出在`char *http = "http://www.";`这行代码上。你声明的`http`是一个指向字符串常量的指针,它指向的是只读内存区域。当你尝试使用`strcat`函数拼接字符串时,这将导致未定义的行为。 要解决这个问题,你可以将`http`声明为一个字符数组,并初始化为包含所需字符串的空间大小。例如,可以修改代码如下: 此外,你还需要注意`domain`和`index_url`的声明方式。它们应该是字符数组而不是字符变量。修改代码如下: ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-8 18:52:56 | 显示全部楼层    本楼为最佳答案   
问题出在`char *http = "http://www.";`这行代码上。你声明的`http`是一个指向字符串常量的指针,它指向的是只读内存区域。当你尝试使用`strcat`函数拼接字符串时,这将导致未定义的行为。

要解决这个问题,你可以将`http`声明为一个字符数组,并初始化为包含所需字符串的空间大小。例如,可以修改代码如下:

  1. char http[LEN] = "http://www.";
复制代码


此外,你还需要注意`domain`和`index_url`的声明方式。它们应该是字符数组而不是字符变量。修改代码如下:

  1. char domain[LEN] = {0}, index_url[LEN] = {0};
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-2-8 20:09:08 From FishC Mobile | 显示全部楼层
FishC 发表于 2024-2-8 18:53
问题出在`char *http = "http://www.";`这行代码上。你声明的`http`是一个指向字符串常量的指针,它指向的 ...

我之前将http变量声明为 char http[] 这样一个数组,也会出错。在声明字符数组,并且用字符串字面量初始化时,省略数组长度会有什么问题吗?这和 char http[LEN] 有什么区别吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-8 20:09:17 | 显示全部楼层
孤不冷cing 发表于 2024-02-08 20:09
我之前将http变量声明为 char http 这样一个数组,也 ...


声明字符数组时,可以省略数组长度,在这种情况下,编译器会根据字符串字面量的长度自动确定数组的长度。然而,需要注意的是,如果你忘记了为`http`数组预留足够的空间以容纳拼接后的字符串,会导致缓冲区溢出的问题。

在你的代码中,如果你将`http`声明为字符数组,并且使用字符串字面量进行初始化,可以这样写:

  1. char http[] = "http://www.";
复制代码


这样,编译器会根据字符串字面量的长度自动确定数组的长度,确保足够的空间来存储它。

另外,你对`domain`和`index_url`的声明方式也有错误。它们应该是字符数组,而不是字符变量。修改代码如下:

  1. char domain[LEN] = {0}, index_url[LEN] = {0};
复制代码


这样,你为它们分配了足够的空间来存储输入的URL和构建后的索引URL。

修正以上问题后,你的代码应该可以正确执行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 08:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表