【问题标题】:Inserting String into String in C在C中将字符串插入字符串
【发布时间】:2017-04-04 19:10:53
【问题描述】:

长度函数:

int length(const char s[])
{
    int length = 0;
    while(s[length]!='\0')
    {
        length++;
    }

    return length;
}

插入函数:

    void insert(char s1[], const char s2[], int n)
{
    char *beginOfString = s1;
    int lengthOfS1 = length(s1);
    int lengthOfS2 = length(s2);
    char s1Copy[lengthOfS1 + lengthOfS2];
    int c, afterC, lengthOfRemainingPart;

    c = 0; 
    c = n + 1;
    beginOfString += c;
    afterC = c; //nth position to start from to add onto array
    lengthOfRemainingPart = length(beginOfString);
    c = 0;

    int counter = 0;
    for(c = 0; c < length(s1) - 1; c++) {

        s1Copy[c] = s2[counter];
        for(c = afterC; c < (lengthOfS1 + lengthOfS2) - 1; c++) {
            if(c == afterC) {
                s1Copy[c] = s2[counter];
            } else {
                counter++;
                if(s2[counter] != *"\0")
                s1Copy[c] = s2[counter];
            }
        }
    }
    c = 0;

    for(c = 0; c < length(s1Copy) - 1; c++) {
        printf("\n %c \n", s1Copy[c]);
    }

    printf("\n");
    printf("\n %s \n", beginOfString);
    printf("\n  %s \n", "LINE");
}

函数调用(及相关声明):

#define MAX_STR 20
char ab[MAX_STR + 1] = "Chicken and Chips";
   char  b[MAX_STR + 1] = "Scampi";       
   insert(ab, b, 7);

我正在尝试将一个 char 数组插入另一个 char 数组,同时保持其余字符仍在数组中,但根据用户想要根据 n 值插入 char 数组的位置进行移动。

这似乎不起作用,并且似乎输出了错误的值。函数调用和函数头(参数类型等)需要保持我放置它们的方式。只有函数体本身可以改变。

输出应该是“ChickenScampi and Chips”

任何想法我哪里出错了?干杯。

【问题讨论】:

  • 你会粘贴你的代码输出,想看看你得到了什么?
  • 一无所获:/
  • 如果您尝试插入“Scampi”,问题会更清楚,因为我们不知道哪个双“鸡”是第一个。
  • 您使用相同的索引变量嵌套了 for 循环。外循环对我来说似乎没用
  • 所以我可以看到的问题是,你没有用 '\0' 终止 s1copy,但你正在调用它的长度。计数很可能超出范围(即 UB)。

标签: c arrays string pointers char


【解决方案1】:

不会粉饰它。这段代码很乱。如果您只是简单地完成,您尝试完成的任务是最简单的

  • s1[] 的 [0..min(n, lengthS1))(注意右侧的排他性)复制到您的目标。
  • s2[] 附加到目标。
  • s1[min(n, lengthS1)]s1[lengthS1] 附加到目标。
  • 终止字符串
  • 就是这样。

最重要的是,目标必须能够容纳 both 字符串 一个 nulchar 终止符,而您的目标缓冲区不这样做(它短一个字符) .

不需要嵌套的 for 循环。不管你是在自己的索引变量上行走,你的都坏了。

#include <stdio.h>

size_t length(const char s[])
{
    const char *end = s;
    while (*end)
        ++end;
    return end - s;
}

void insert(const char s1[], const char s2[], int n)
{
    size_t lengthOfS1 = length(s1);
    size_t lengthOfS2 = length(s2);
    size_t pos = (n < lengthOfS1) ? n : lengthOfS1;
    size_t i;

    // declare VLA for holding both strings + terminator
    char s1Copy[lengthOfS1 + lengthOfS2 + 1];

    // put in part/full s1, depending on length
    for (i=0; i<pos; ++i)
        s1Copy[i] = s1[i];

    // append s2
    for (i=0; i<lengthOfS2; ++i)
        s1Copy[pos+i] = s2[i];

    // finish s1 if needed.
    for (i=pos; i<lengthOfS1; ++i)
        s1Copy[i+lengthOfS2] = s1[i];

    // termiante string
    s1Copy[lengthOfS1 + lengthOfS2] = 0;

    puts(s1Copy);
}

int main()
{
    char ab[] = "Chicken and Chips";
    char  b[] = "Scampi";
    insert(ab, b, 0);
    insert(ab, b, 7);
    insert(ab, b, 100);
}

输出

ScampiChicken and Chips
ChickenScampi and Chips
Chicken and ChipsScampi

总结

如果您不确定发生了什么,您应该做的最后件事是编写更多代码。相反,停止编码,拿些纸和书写工具,重新思考问题。

【讨论】:

  • 哇!好的,现在我知道我哪里出错了。现在它更有意义了,因为你把它分解成碎片,我想我现在会选择笔和纸的解决方案。我是 .NET 和 Java 开发人员……以及其他一些脚本语言等……所以我还在学习 C,看来我现在要开始使用笔和纸了 - 感谢您对问题!
  • @Imdad 很高兴它有帮助。我会从 pencil =P 开始
  • 幸运的是您提供了解决方案并且没有尝试调试 OPs 代码。我试过了。经验教训
  • @AjayBrahmakshatriya 哦,我试过了。相信我。最终,将试图解决的问题分解出来,然后展示如何完成,而不是在提议的解决方案中烧毁许多问题,这更容易。
  • @Imdad 将给定的以空字符结尾的字符串打印到标准输出,包括尾随换行符。实际上是printf("%s\n", s1Copy); 的同义词,但更容易输入。它也很可能更有效,因为不需要进行参数格式解析。 See it here。 (并为该站点添加书签,它是 stellar 用于 C 和 C++ 信息)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多