在C中交替交替2个字符串

时间:2016-03-21 10:43:56

标签: c arrays

我制作的C程序在给定2个字符串时会交换所有字母。例如,如果它被给予" abc"和" 123",它应该给出输出" a1b2c3"。我遇到的问题是当我访问数组中的元素时。代码没有运行并出错。这是我的代码: -

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

int main()
{
    char a[80];
    char b[80];
    char l[120];
    char f[120];
    strcpy(a, "abc");
    strcpy(f, "");
    strcpy(l, "abc");
    strcpy(b,"123");
    strcat(a,b);
    int pop;
    pop = sizeof(a);
    int j;
    int k;
    k=0;

    for (j=0;j<pop;j++)
    { 
        if (j%2==0 ) {
            strcat(f,l[k]);
        } 
        else{
            strcat(f,b[k]);
            k++;
        }
    }
    printf("String is %s ",f);
}

7 个答案:

答案 0 :(得分:1)

问题在于连接。尝试将其附加到字符串

strncat(f, &l[k],1);

检查下面的循环,它应该可以正常工作

pop = strlen(a);//change this
for (j = 0; j < pop; j++)
{
    if (j % 2 == 0) {
        strncat(f, &l[k],1);  
    }
    else {
        strncat(f, &b[k],1);
        k++;
    }
}
printf("String is %s ", f);

输出:

a1b2c3

欢呼声

答案 1 :(得分:1)

尝试更改

pop = strlen(a)

将for循环更改为

for (j = 1; j <= pop; j++)
{
    if (j % 2 == 0) {
        strcat(f, l[k]);
        k++;
    }
    else {
        strcat(f, b[k]);
    }
}
printf("String is %s ", f);

答案 2 :(得分:1)

您可以简单地分配字符而不是使用连接:

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

int main()
{
char a[80];
char b[80];
char l[120];
char f[120];
strcpy(a, "abc");
strcpy(f, "");
strcpy(l, "abc");
strcpy(b,"123");
strcat(a,b);
int pop;
pop= strlen(a);

int j,k=0;

int index = 0;
for (j=0;j<pop;j++)
{
    if (j%2==0 ) {
        f[index++] = l[k];
       // printf("%s\n",f);
    }
    else{
        f[index++] = b[k];
        k++;
    }
}
f[index] = '\0';
printf("String is %s ",f);
}

答案 3 :(得分:1)

做事很简单。尝试这样的事情:

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

int main(void)
{
    char a[80];
    char b[80];
    char l[120];
    strcpy_s(a, sizeof(a), "abc");
    strcpy_s(b, sizeof(b), "123");
    int pop;
    pop = strlen(a);
    int i, j = 0;

    for (i = 0; i < pop * 2; i++)
    {
        if (i % 2 == 0) {
            l[i] = a[j];
        }
        else {
            l[i] = b[j++];
        }
    }
    l[i] = '\0';
    printf("String is %s ", l);
}

答案 4 :(得分:1)

您错误地使用了strcat,因为每次调用它时只需附加'\0'并且您遇到缓冲区溢出,您会在数组末尾写入。分配字符而不是此字符,并仔细检查您是否访问有效和正确的索引。断言结果字符串为空终止。

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

int main(void)
{
    char even[4];
    char odd[4];
    char res[7];
    strcpy(even, "abc");
    strcpy(odd,"123");
    int pop;
    printf("even %s\n", even);
    printf("odd %s\n", odd);
    pop = sizeof(res)-1;
    int j;

    for (j=0; j<pop; ++j)
    { 
       if (j%2 == 0 ) {
            res[j] = even[j/2];
        } 
        else{
            res[j] = odd[(j-1)/2];
        }
    }
    res[j] = '\0';
    printf("String is %s",res);
}

https://ideone.com/1aYupy

答案 5 :(得分:1)

你已经得到了足够的答案。其中一些人和其他人指出了你的错误:

  • 当您逐个字符构建字符串时,请勿使用strcat。手动将字符分配给char数组。确保你没有溢出缓冲区并且不要忘记最后的空字符。

  • sizeof不会给你一个字符串的长度。来自strlen的{​​{1}}会这样做,但字符串必须正确地以空值终止才能生效。实际上,您可以在循环中使用<strings.h>来检查是否超过了null终止符。

  • 注意输入。例如,你的代码中有四个字符串,但实际上你只需要三个:你要交错的两个源字符串和结果字符串。在您的代码中,源字符串最多包含80个字符。结果字符串最多包含120个字符。当源字符串超过60个字符时,缓冲区将溢出。

  • 源字符串长度不同时会发生什么?你想在较短的字符串用完时停止交错吗?您是否只想在交错后附加剩余的较长字符串?这是你应该考虑和关心的事情。在您的代码中,第一个字符串必须短于第二个字符串,但您不能强制执行该操作。

这是一个使用简单方法的解决方案:

  • 只要源字符串中仍有字符,请从两个字符串中取出第一个字符并将它们放入结果字符串中。
  • 之后,将剩下的longerstring追加到字符串中。

请注意,代码注意不要溢出缓冲区并确保字符串以null结尾,即使它被缩短也是如此。

str[i] != '\0'

答案 6 :(得分:0)

    pop = sizeof(a);

不会返回a的内容大小但是数组的大小。正如@hacks所提到的,你应该使用&#39; strlen&#39;。

也不要使用strcpy初始化字符串或strcat来附加字符,以初始化字符串:

    f[0] = '\0';

追加:

    int d = 0;
    f[d] = '\0';
    pop = strlen(a);    
    for( j=0; j<pop; j++) {
        if (j % 2 == 0) {
            f[d++] = l[k];
        } else {
            f[d++] = b[k++];
        }
    }

调用strcat追加1个字节的效率不高。