【问题标题】:C string functions errorC字符串函数错误
【发布时间】:2017-12-05 14:47:01
【问题描述】:

我正在处理一项任务,但我的代码有问题:

int is_ascii_match(const char c1[], const char c2[], char res[MAX_STRING_SIZE]) {
....

    if (val_c1 == val_c2) {
        strcpy(res, strcat(strcat(c1, '&'),c2));
    }
    else
        return 0;

我收到一个错误:

访问冲突读取位置

我传递的参数是错误的还是..?

【问题讨论】:

  • val_c1val_c2 的计算和值是否与您的问题相关?如果不是,为什么要包括这些行?如果是,它们是什么?
  • 我很难相信像你这样名声大噪的用户不知道minimal complete examples
  • 那是因为我认为错误与我在 String 函数中传递的参数有关,而且似乎不需要任何其他信息 @Beta ,尽管对 C 来说还是新的,所以也许我错了。
  • 不要忽略编译器的诊断信息。我敢肯定,编译器已经通知了你这个问题。

标签: c string strcpy


【解决方案1】:

strcat 需要一个非常量 char*。你传递了一个const 这就是编译器抱怨的原因。

第二个参数也是"&"。 (之前你传递了char)。

来自标准 §7.24.3.1

char *strcat(char * restrict s1, const char * restrict s2);

strcat 函数附加了s2 指向的字符串的副本 (包括终止的空字符)到字符串的末尾 由s1 指向。

所以s1 将被修改(第一个参数),这就是为什么它应该是非常量。

【讨论】:

  • 谢谢,我会尽可能批准 :)
  • 看起来不太对劲。你说的是外部strcat 还是内部?哪个参数应该是非常量时是 const?
  • @Beta.: 第一个将被修改。
  • 对不起,你是对的,我误读了这个问题。我可以发誓c1 被宣布为非常量。
  • @Beta.: 没关系,不用抱歉。感谢您的光临。
【解决方案2】:

'&' 是一个字符字面量,是一个小整数。 strcat 的第二个参数是 const char*,它是一个指向字符的指针(更准确地说,是指向 chars 的连续 NUL 终止数组中的第一个字符的指针)。 你大概打算"&",这是一个两字节数组。

尝试将小整数解释为指针会导致错误指示的问题。

如果不是因为读取第二个参数的问题,当strcat 尝试修改其第一个参数指向的字符串const 时可能会出现错误,因此可以想象为只读记忆。 (修改第一个参数在语义上似乎也不正确。)

如果您在启用警告的情况下进行编译,您应该会看到有关参数类型的警告。

对于这个特殊的问题,考虑使用snprintf(res, MAX_STRING_SIZE, "%s&%s", c1, c2),它可以避免修改c1 并防止缓冲区溢出。 (如果您关心截断,则应将返回值与MAX_STRING_SIZE 进行比较。)

【讨论】:

    猜你喜欢
    • 2014-07-13
    • 2011-11-19
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多