我想编写一个程序,在其中复制给定字符串中的每个字母。
例如,如果输入为abc
,则输出为aabbcc
。
我该怎么做?
到目前为止是我的代码。它只复制字符串:
#include <stdio.h>
int main () {
char str_in[100];
char str_out[200] = "";
int i;
printf("Enter a word: ");
scanf("%s", str_in);
for (i = 0; i < sizeof(str_in); i++) {
str_out[i] += str_in[i];
}
printf("Duplicated word: %s", str_out);
return 0;
}
对于初学者,目标字符数组至少应比源数组大两倍。
执行复制的循环可以如下所示
size_t j = 0;
for ( size_t i = 0; str_in[i] != '\0'; i++ )
{
str_out[j++] = str_in[i];
str_out[j++] = str_in[i];
}
str_out[j] = '\0';
这是您想要做的一种方法-因为您知道要访问的str_out
中的两个索引对应于i
的第i+1
和str_in
个位置:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int main(void)
{
char str_in[SIZE];
char str_out[SIZE*2];
int i, len;
printf("Enter a word: ");
scanf("%s", str_in);
len = strlen(str_in);
for (i = 0; i < len; i++) {
str_out[i*2] = str_in[i];
str_out[i*2+1] = str_in[i];
}
str_out[i*2] = '\0';
printf("Duplicated word: %s\n", str_out);
return EXIT_SUCCESS;
}
您也可以使用另一个变量并像这样在循环内更新:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int main(void)
{
char str_in[SIZE];
char str_out[SIZE*2];
int i, j, len;
printf("Enter a word: ");
scanf("%s", str_in);
len = strlen(str_in);
for (i = 0, j = 0; i < len; i++, j += 2) {
str_out[j] = str_in[i];
str_out[j+1] = str_in[i];
}
str_out[j] = '\0';
printf("Duplicated word: %s\n", str_out);
return EXIT_SUCCESS;
}
作为旁注,最好是#define
您的常量,而不要在代码中包含它们。
我建议仅分配所需的内存量:
char *str_out = malloc(strlen(str_in) + 1);
然后使用另一个每次计数为2的循环变量,因此循环中每个字符的空间是2倍。
如果这样做,还应将+ 1
放在新循环变量旁边,以将其复制到字符串的当前和下一个元素,从而复制字符。
我也建议您将size_t
用于循环变量以匹配str_len
的返回值。
我在这里实现了我的建议:
size_t str_ctr;
size_t str_ctrx2;
size_t in_str_len = strlen(in_str)
/* ... */
for( str_ctrx2 = str_ctr = 0;
str_ctr < in_str_len;
str_ctr++, str_ctrx2 += 2 )
{
out_str[str_ctrx2] = in_str[str_ctr];
out_str[str_ctrx2 + 1] = in_str[str_ctr];
}
/* null-terminate the string */
out_str[str_ctrx2] = '\0';
我还想提到,您忘记了在程序中以空值终止字符串。我对此发表了评论,并在上面向您展示了如何进行。
#include <stdio.h>
int main () {
char str_in[100];
char str_out[200] = "";
int i, j;
printf("Enter a word: ");
scanf("%s", str_in);
j=0;
for (i = 0; i < sizeof(str_in); i++) {
str_out[i] = str_in[j];
str_out[i+1] = str_in[j];
i++;
j++;
}
printf("Duplicated word: %s", str_out);
return 0;
}