我制作的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);
}
答案 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);
}
答案 5 :(得分:1)
你已经得到了足够的答案。其中一些人和其他人指出了你的错误:
当您逐个字符构建字符串时,请勿使用strcat
。手动将字符分配给char
数组。确保你没有溢出缓冲区并且不要忘记最后的空字符。
sizeof
不会给你一个字符串的长度。来自strlen
的{{1}}会这样做,但字符串必须正确地以空值终止才能生效。实际上,您可以在循环中使用<strings.h>
来检查是否超过了null终止符。
注意输入。例如,你的代码中有四个字符串,但实际上你只需要三个:你要交错的两个源字符串和结果字符串。在您的代码中,源字符串最多包含80个字符。结果字符串最多包含120个字符。当源字符串超过60个字符时,缓冲区将溢出。
源字符串长度不同时会发生什么?你想在较短的字符串用完时停止交错吗?您是否只想在交错后附加剩余的较长字符串?这是你应该考虑和关心的事情。在您的代码中,第一个字符串必须短于第二个字符串,但您不能强制执行该操作。
这是一个使用简单方法的解决方案:
请注意,代码注意不要溢出缓冲区并确保字符串以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个字节的效率不高。