【问题标题】:Warning C4047 and C4024 when trying to append characters to string尝试将字符附加到字符串时出现警告 C4047 和 C4024
【发布时间】:2015-03-15 10:46:23
【问题描述】:

我有一个代码想要将英文字母表中的所有后者放入一个字符串中,问题是,Visual Studio 给了我这个:警告

warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char'

还有这个:警告 2

warning C4024: 'strcat' : different types for formal and actual parameter 2

这是代码,请告诉我它有什么问题无法正确编译。

#include <stdio.h>
#include <string.h>

#define NUM_ABC_LET 27
void makeABC(char abc[NUM_ABC_LET]);

int main()
{
    char abcString[NUM_ABC_LET] = "";
    makeABC(abcString);
    puts(abcString);
    return (0);
}

void makeABC(char abc[NUM_ABC_LET])
{
    char letter;
    for (letter = 'a'; letter <= 'z'; letter++)
    {
        strcat(abc, letter);
    }
}

【问题讨论】:

  • 你不觉得charchar * 是不同的类型吗?
  • strcat() 需要两个 char 指针,而不是 char 指针和 char
  • ASCII 字母只有 25 个字母。
  • @alk 其实有 26 个,第 27 个是空字符。
  • @zenith:胡,你是对的。顺便说一句,我知道0-terminator,但我只是算错了...... :-}

标签: c string char strcat


【解决方案1】:

标准 C 函数strcat 处理字符串。因此,如果您确实想使用函数strcat,那么循环可能看起来像

void makeABC( char abc[NUM_ABC_LET] )
{
    char letter[] = "a";
    for ( ; letter[0] <= 'z'; letter[0]++ )
    {
        strcat( abc, letter );
    }
}

【讨论】:

  • 太棒了,你帮了我很多谢谢。但是你能解释一下什么是编译错误,什么是运行时错误?
  • @Amnon Hanuhov 实际上,这个警告“警告 C4047: 'function' : 'const char *' 在间接级别上与 'char' 不同”意味着该函数需要一个指向字符的指针(即通过指针间接访问对象)作为第二个参数,但您使用的是标量字符而不是指针。第二个警告的含义相同。
【解决方案2】:

改变

 strcat(abc, letter);

  abc[letter - 'a'] = letter;

然后添加

abc[26]  = 0;

【讨论】:

  • 这不是很有帮助,因为它没有解释为什么解决方案有效,以及为什么 OP 的代码无效。
  • @zenith: 正确... - 但是这是迄今为止最有效的解决方案。
【解决方案3】:

strcat 接受两个 char 指针,它们指向 C 字符串,即以空字符结尾的字符数组。

您传递的是letter,它是char,而不是C 字符串。再试一次。

【讨论】:

    【解决方案4】:

    你必须作为 strcat 的 2arg 传递一个 char * arg,所以你必须改变

    strcat(abc, letter) 
    

    strcat(abc, &letter)
    

    这将消除您之前代码的段错误。

    【讨论】:

    • 这行不通,因为两个参数都必须是 null-terminated 字符串。 &amp;letter 只是一个指向 char 的指针,没有空终止符。
    • strcat 期望它的两个参数都以 NUL 结尾。因此,您的建议会调用未定义的行为。
    • @Drome 我们刚刚告诉过你。这个答案没有用,因为它不能解决 OP 的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 2013-06-04
    • 2018-04-12
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2021-09-20
    相关资源
    最近更新 更多