【问题标题】:strcat() could not concatenatestrcat() 无法连接
【发布时间】:2015-05-14 04:51:02
【问题描述】:

我有一个二维字符数组要连接成一个数组。它有一个错误:

错误 C2664: 'strcat' : 无法将参数 1 从 'char *[80]' 转换为 'char *'

代码如下:

char *article[5] = {"the", "a", "one", "some", "any"};
char *sentence[80];

num = rand() % 5;
for(int x = 0; x < strlen(article[num]); x++){
    strcat(sentence, article[num][x]);    //a random element will be concatinated to the sentence array
}

【问题讨论】:

  • char *sentence[80]更改为char sentence[80]
  • 你不需要for循环......strcat(sentence, article[num])应该足够strcat复制整个字符串。
  • 我尝试了你的建议,但它显示了一些奇怪的字符,而不是文章数组中的字符。
  • 你不能连接到一个不存在的 ASCIIZ 字符串,并且在你的代码中你没有初始化 sentence 所以它不包含一个 ASCIIZ 字符串并且是非法的读取:这不是使用strcat 的合适前提条件。尝试char sentence[80] = { '\0' }; 或在sentence 的定义和strcat 之间添加sentence[0] = '\0';。我不确定你想用循环做什么:你的意思是随机选择一篇文章连接,然后连接另一篇文章,直到你连接 5?
  • @TonyD 是的,初始化工作。是的,你是对的,我正在连接随机文章,直到我得到 5。但是这里的循环可以在单个索引中显示所有字符,如果我删除循环,它只会连接单词的第一个字母。跨度>

标签: c arrays string strcat


【解决方案1】:

这里有一些固定的代码可能会做你想做的事,但很难确定你想要什么......

srand(time_t(0));  // seed the random number generate once

// use const when handling pointers to string literals
const char* article[5] = {"the", "a", "one", "some", "any"};

char sentence[80];  // 80 character buffer in automatic storage - no pointers
sentence[0] = '\0'; // empty ASCIIZ string to start

for (int x = 0; x < 5; ++x)
{
    int num = rand() % 5;

    strcat(sentence, article[num]);
}
printf("%s\n", sentence);

【讨论】:

  • 可能值得添加strcat(sentence, " "); 以利于输出格式。
  • 最后一个问题,如何让第一个单词的第一个字母toUpper用这个?
  • @chrisjohn016 sentence[0] = toupper(sentence[0])); 但是在线教程中很容易找到类似的内容。不用在这里问,然后等人回答。
  • @MrLister 是的,我知道它在教程中。但我的意思是,我如何使第一个字母 toUpper() 是我想让每个单词的第一个字母 toUpper?因为句子[0] = toupper(句子[0]));仅将第一个单词的第一个字母大写..
  • @chrisjohn016:最简单的方法显然是更改article 的字符串文字,下一个最简单的方法可能是用@987654325 记录当前的字符串结束位置(NUL 终止符所在的位置) @ 在你调用strcat 之前,然后在strcat 之后使用*p_nul = toupper(*p_nul); 用大写版本覆盖新放置在那里的字符。这有点低效(反复调用strlen),但除非您处理数百万个长字符串,否则这不太重要。
【解决方案2】:

您的句子定义有误。您正在使用的代码 char *sentence[80] 定义了一个指向 80 个字符串指针数组的指针。不要使用 * 限定符。这是一些代码:

#define MAX_ARRAY 5
#define MAX_SENTENCE 80

char *article[MAX_ARRAY] = {"the", "a", "one", "some", "any"};
char sentence[MAX_SENTENCE];
int num;

num = rand() % MAX_ARRAY
strncat(sentence, article[num], MAX_SENTENCE - 1);
sentence[MAX_SENTENCE - 1] = 0x00;

请注意,我使用 strncat 而不是 strcat。尽管您发布的代码不会溢出缓冲区,但鉴于当今代码重用的规模,检查目标的大小始终是一种好习惯,这样您就不会引入安全漏洞。

【讨论】:

    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多