用字符串替换char

时间:2015-05-25 18:13:23

标签: c string

我需要用多个字符(一个字符串)替换一些字符,但是我被卡住了。此代码用于将一个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 | =■(

4 个答案:

答案 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)

查看strcathttp://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;时要小心。在文字中(与你的上一个案例一样),它可能没有达到你所期望的效果。