将数组中的字母更改为 3 个不同的字母
Change letter in array for 3 different letter
我需要以某种方式更改数组中的文本,我需要将所有有 a
字符的地方更改为 123
。
示例:对于给定的文本:ayasxka
我应该得到这个:12123k123
或这个 12323k123
文本。
我差一点就成功了,但我得到的不是数字之间的 k
,而是 s
,我的意思是,这是我的结果:12123s123
.
int main()
{
int i, j = 0;
char t[] = "ayasxka";
char *r = malloc(sizeof(char) * (strlen(t) + 2));
memset(r, '[=10=]', (strlen(t) + 1));
for(i=0; t[i] != '[=10=]'; i++)
{
if(t[i] == 'a')
{
r[i] = '1';
r[i+1] = '2';
r[i+2] = '3';
}
else
r[i+2] = t[i];
}
printf("%s\n", r);
free(r);
return 0;
}
问题是 strlen(t) + 2
不够,考虑最坏的情况,即字符串仅由 a
个字符组成,那么它应该是
char *r = malloc(3 * strlen(t) + 1);
顺便说一句szieof(char) == 1
是强制性的。
你需要一个计数器来计算 r
字符串中的位置,比如 j
试试这个
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
int i, j = 0;
char t[] = "ayasxka";
/* don't call strlen multiple times, store the value if it wont change */
size_t length = strlen(t);
/* it doesn't matter how unlikely malloc will fail, check that + */
char *r = malloc(3 * length + 1); /* | */
if (r == NULL) /* <--------------------------------------------+ */
return -1;
for (i = 0 ; t[i] != '[=11=]' ; i++)
{
if(t[i] == 'a')
{
r[j++] = '1';
r[j++] = '2';
r[j++] = '3';
}
else
r[j++] = t[i];
}
/* you don't need the memset */
r[j] = '[=11=]';
printf("%s\n", r);
free(r);
return 0;
}
在你的算法中你应该使用:
for(i=0; t[i] != '[=10=]'; i++)
{
if(t[i] == 'a')
{
j = i;
r[j++] = '1';
r[j++] = '2';
r[j++] = '3';
}
else if(j==i)
r[j++] = t[i];
}
r[j] = '[=10=]';
并且在你的 malloc
中你应该为 '[=14=]'
添加 +1 字符,因为 strlen()
不计算那个,所以
char *r = malloc(3 + strlen(t));
而不是
char *r = malloc(2 + strlen(t));
这会给你 12123k123
int i;// j = 0;//unused `j`
char t[] = "ayasxka";
char *r = calloc(strlen(t) + 2 + 1, sizeof(char));//change size, +2: for last a, +1: for NUL
//memset(r, '[=10=]', (strlen(t) + 1));//calloc initialize by 0
for(i=0; t[i] != '[=10=]'; i++){
if(t[i] == 'a'){
r[i] = '1';
r[i+1] = '2';
r[i+2] = '3';
}
else if(r[i] == '[=10=]'){//Not yet been set to the value
r[i] = t[i];
}
}
printf("%s\n", r);//12123k123
free(r);
char t[] = "ayasxka";
int i, len = strlen(t);
char *r = calloc(len + 2 + 1, sizeof(char));
for(i=len-1; i>=0; --i){
if(t[i] == 'a'){
r[i] = '1';
r[i+1] = '2';
r[i+2] = '3';
}
else if(r[i] == '[=11=]'){
r[i] = t[i];
}
}
printf("%s\n", r);//12323k123
free(r);
我需要以某种方式更改数组中的文本,我需要将所有有 a
字符的地方更改为 123
。
示例:对于给定的文本:ayasxka
我应该得到这个:12123k123
或这个 12323k123
文本。
我差一点就成功了,但我得到的不是数字之间的 k
,而是 s
,我的意思是,这是我的结果:12123s123
.
int main()
{
int i, j = 0;
char t[] = "ayasxka";
char *r = malloc(sizeof(char) * (strlen(t) + 2));
memset(r, '[=10=]', (strlen(t) + 1));
for(i=0; t[i] != '[=10=]'; i++)
{
if(t[i] == 'a')
{
r[i] = '1';
r[i+1] = '2';
r[i+2] = '3';
}
else
r[i+2] = t[i];
}
printf("%s\n", r);
free(r);
return 0;
}
问题是 strlen(t) + 2
不够,考虑最坏的情况,即字符串仅由 a
个字符组成,那么它应该是
char *r = malloc(3 * strlen(t) + 1);
顺便说一句szieof(char) == 1
是强制性的。
你需要一个计数器来计算 r
字符串中的位置,比如 j
试试这个
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
int i, j = 0;
char t[] = "ayasxka";
/* don't call strlen multiple times, store the value if it wont change */
size_t length = strlen(t);
/* it doesn't matter how unlikely malloc will fail, check that + */
char *r = malloc(3 * length + 1); /* | */
if (r == NULL) /* <--------------------------------------------+ */
return -1;
for (i = 0 ; t[i] != '[=11=]' ; i++)
{
if(t[i] == 'a')
{
r[j++] = '1';
r[j++] = '2';
r[j++] = '3';
}
else
r[j++] = t[i];
}
/* you don't need the memset */
r[j] = '[=11=]';
printf("%s\n", r);
free(r);
return 0;
}
在你的算法中你应该使用:
for(i=0; t[i] != '[=10=]'; i++)
{
if(t[i] == 'a')
{
j = i;
r[j++] = '1';
r[j++] = '2';
r[j++] = '3';
}
else if(j==i)
r[j++] = t[i];
}
r[j] = '[=10=]';
并且在你的 malloc
中你应该为 '[=14=]'
添加 +1 字符,因为 strlen()
不计算那个,所以
char *r = malloc(3 + strlen(t));
而不是
char *r = malloc(2 + strlen(t));
这会给你 12123k123
int i;// j = 0;//unused `j`
char t[] = "ayasxka";
char *r = calloc(strlen(t) + 2 + 1, sizeof(char));//change size, +2: for last a, +1: for NUL
//memset(r, '[=10=]', (strlen(t) + 1));//calloc initialize by 0
for(i=0; t[i] != '[=10=]'; i++){
if(t[i] == 'a'){
r[i] = '1';
r[i+1] = '2';
r[i+2] = '3';
}
else if(r[i] == '[=10=]'){//Not yet been set to the value
r[i] = t[i];
}
}
printf("%s\n", r);//12123k123
free(r);
char t[] = "ayasxka";
int i, len = strlen(t);
char *r = calloc(len + 2 + 1, sizeof(char));
for(i=len-1; i>=0; --i){
if(t[i] == 'a'){
r[i] = '1';
r[i+1] = '2';
r[i+2] = '3';
}
else if(r[i] == '[=11=]'){
r[i] = t[i];
}
}
printf("%s\n", r);//12323k123
free(r);