我需要用多个字符(一个字符串)替换一些字符,但是我被卡住了。此代码用于将一个char替换为另一个char,但如果替换是多个chars,则输出会混乱。
这是我到目前为止的代码:
char input[50];
char output[150];
int i;
printf("Enter your text: ");
fgets(input, 50 , stdin);
for (i = 0; input[i] != '\0'; i++){
switch (input[i]){
case 'a': output[i]= '4'; break;
case 'd': output[i]= '|)';break;
case 'e': output[i]= '3'; break;
case 'f': output[i]= '|='; break;
case 'u': output[i]= '|_|'; break;
case 'w': output[i]= '\|/'; break;
/* REST OF THE ALPHABET
INTENTIONALLY SUPPRESSED*/
}
}
printf("Your new text is: %s", output);
return 0;
正如dasblinkenlight所建议的那样,我为输出设置了另一个索引,这工作得很好,但是我在输出文本的末尾有两个额外的字符......这些字符来自哪里?
这是一个例子:
输入您的文字:afedef 你的新文字是:4 | = 3 |)3 | =■(
答案 0 :(得分:0)
您的代码中存在两个问题:
您正在使用i
来迭代输出数组。输入数组和输出数组的大小不同。可能会发生(例如,在f
的情况下)输入数组的索引需要递增1,而输出数组的索引应递增2或3 。
您无法将多个字符分配给数组中的单个字符插槽。例如,case 'f': output[i]= '|='; break;
不正确。
要解决此问题,您应该使用另一个变量并使用添加的字符数递增它。例如:
int j = 0;
...
case 'e':
output[j++]= '3';
break;
case 'f':
output[j++]= '|';
output[j++]= '=';
break;
答案 1 :(得分:0)
1)您无法使用=
运算符复制字符串。
2)c中的字符串文字用双引号包围
3)字符串文字中的反斜杠(' \')等特殊字符具有特殊含义,应进行转义。
4)为了做你想要的事情你需要:
a)用于跟踪output
字符串中位置的附加计数器,其中将写入下一个字符串
b)使用strcpy/strncpy
而不是赋值运算符=
,这样`switch语句中的每一行看起来都与此类似:
case 'f': strcpy(&output[j], "|="); j+=2; break;
此处j
是第二个计数器,增加了写入output
的字符数
答案 2 :(得分:0)
尝试以下
#include <string.h>
//...
char *p = input, *q = output;
do
{
switch ( *p )
{
case '\0': *q = *p; break;
case 'a': *q++ = '4'; break;
case 'd': strcpy( q, "|)" ); q += 2; break;
case 'e': *q++ = '3'; break;
case 'f': strcpy( q, "|=" ); q += 2; break;
case 'u': strcpy( q, "|_|" ); q += 3; break;
case 'w': strcpy( q, "\|/" ); q += 3; break;
/* REST OF THE ALPHABET
INTENTIONALLY SUPPRESSED*/
}
} while ( *p++ );
或者不是使用strcpy
,而是可以逐个分配每个caharcter,例如
case 'd': *q++ = '|'; *q++ = ')'; break;
答案 3 :(得分:0)
查看strcat
(http://www.cplusplus.com/reference/cstring/strcat/):
char input[50];
char output[150];
int i;
printf("Enter your text: ");
fgets(input, 50 , stdin);
output[0] = 0; // null terminate before calling strcat.
for (i = 0; input[i] != '\0'; i++)
{
switch (input[i])
{
case 'a': strcat(output, "4"); break;
case 'd': strcat(output, "|)"); break;
//...
}
}
printf("Your new text is: %s", output);
此外,C ++中单引号中的多个字符是实现定义的(C++ multicharacter literal),您可能希望避免它们。另外,使用&#39; \&#39;时要小心。在文字中(与你的上一个案例一样),它可能没有达到你所期望的效果。