【问题标题】:Add one character from a string to the end of another string (strcat)将一个字符串中的一个字符添加到另一个字符串的末尾 (strcat)
【发布时间】:2018-07-18 15:19:01
【问题描述】:
for (unsigned int i = 0; i < strlen(s); i++) {
  if (s[i] != ' ') 
    strcat(p, s[i]);

我想在p 字符串的末尾添加s 字符串的当前字符,前提是它不是空格。我如何使用strcat 做到这一点?上面的代码给出了以下错误“从'char'到'const char*'的无效转换”。

我想使用strcat,因为这样我就不必存储 p 字符串的索引来知道将当前字符放在哪里。我希望这是有道理的。

另外,我需要使用字符数组来执行此操作,而不是 c 字符串或任何被调用的内容。

【问题讨论】:

  • strncat 可能适合您:strncat(p, &amp;s[i], 1);。
  • 成功了,非常感谢。
  • 请注意,在循环中使用strlen() 需要代码在每次迭代时评估长度。知道字符串当前有多长会非常更明智,这样您就可以添加额外的字符而无需调用strcat() — 它还必须在每次迭代时扫描字符串。由于函数调用,您有二次代码 - O(N²),但底层算法只需要是线性的 - O(N)。
  • 还要注意,p 和 s 都必须是 C 字符串——即以空字符结尾的字节序列——因为如果 strlen() 和 strcat() 是不是字符串。所以你最后的评论是错误的。
  • “我如何使用 strcat 做到这一点?” - 你不知道;您使用一个简单的读写器循环,从源缓冲区读取并有条件地写入目标,完成后终止。不要用锯子敲钉子。

标签: c c-strings strcat


【解决方案1】:

更明智的算法会避免使用strcat() 或strncat():

int j = strlen(p);
for (int i = 0; s[i] != '\0'; i++)
{
    if (s[i] != ' ')
        p[j++] = s[i];
}
p[j] = '\0';

这避免了使用strlen() 和strcat()(或strncat())必然涉及的二次行为。这确实意味着您需要跟踪在p 中放置字符的位置,但这样做所涉及的工作是微不足道的。一般来说,二次行为对于 10 个字符左右的字符串不会有问题,但如果字符串达到 1000 字节或更多,那么二次行为就会成为问题(需要 1,000,000 次操作而不是 1,000 次操作 - 这可能会变得很明显)。

【讨论】:

  • 我从来没有被告知这些函数在低级别是如何工作的。我正在准备明年的大学考试,这种东西在高中是不会教的。在那之前,我只想擅长解决问题,能够理解背后的想法,而不是实施的有效性。这就是为什么我更喜欢 strcat,我不需要保留另一个变量来计算第二个字符串的索引。无论如何,感谢您的洞察力。
【解决方案2】:

首先,您需要将地址(数组本身是第一个元素的地址)传递给strcat,而不是char。这就是为什么您需要在 s[i] 之前使用&amp; 运算符。

这里有一个工作示例

#include <stdio.h>
#include <string.h>
int main()
{

    char s[50]= "Hello World";
    char p[50]= "Hello World";
    for(unsigned int i=0;i<strlen(s);i++){
    if(s[i]!=' ') 
    strncat(p,&s[i],1);
    }
    puts(p);
    return 0;
}

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多