2015-05-25 3 views
3

Мне нужно заменить некоторые символы несколькими символами (строка), но я застрял. Этот код работает для замены одного символа на другой, но если замена представляет собой несколько символов, результат беспорядочен.заменить char на строку

Вот код, который я до сих пор:

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

скажем, строка представляет собой ряд водяных масел, завернутых в коробки. если вы хотите вытащить арбуз и заменить его другим, нет проблем. но если вы хотите заменить один водяной микс на 3, вам нужно каждый раз добавлять по 2 коробки. в нашем примере байт - это поле, а символ - водяной микс. –

+0

Не нужно использовать фрукты. Я понял это из примеров, которые я видел. Итак, я попытался добавить «пробелы» к выходному индексу, но это не сработало. –

+0

Пожалуйста, * не пытайтесь * наполнить свой код в скромное поле комментариев. Просто отредактируйте свой пост и добавьте к нему соответствующую информацию. – usr2564301

ответ

0

1) Вы не можете копировать строки с = оператора.
2) Строковый литерал в c окружен двойными кавычками
3) Специальные символы, такие как обратная косая черта ('\') в строковых литералах, имеют особое значение и должны быть экранированы.
4) Для того, чтобы сделать то, что вы собираетесь вам потребуется:
а) Дополнительный счетчик для отслеживания положения в output строки, где следующая строка будет написано
б) использование strcpy/strncpy вместо оператора присваивания =, таким образом, что каждая строка в `переключатель заявление будет выглядеть примерно так:

case 'f': strcpy(&output[j], "|="); j+=2; break; 

Здесь j является второй счетчик увеличивается на количество символов, записанных в output

+0

Это также отлично работает! Спасибо Евгению. –

0

Есть две проблемы в вашем коде:

  • Вы используете i для итерации выходного массива. Размер входного массива и выходного массива различен. Может случиться (например, в случае f), что индекс для входного массива должен быть увеличен на 1 , тогда как индекс для e выходной массив должен быть увеличен на 2 или 3.

  • Вы не можете назначить несколько символов одному слоту символа в массиве. Например, case 'f': output[i]= '|='; break; неверен.

Для решения проблемы вы должны использовать другую переменную и увеличивать ее с добавлением количества символов. Например:

int j = 0; 
... 
    case 'e': 
    output[j++]= '3'; 
    break; 
    case 'f': 
    output[j++]= '|'; 
    output[j++]= '='; 
    break; 
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; 
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), вы будете probab Я хочу их избежать. Кроме того, будьте осторожны при использовании «\» в литералах (как и в вашем последнем случае), вероятно, он не делает то, что вы ожидаете.

Смежные вопросы