Перевод Массива Int В Строку Char

kingl

New member
30.10.2013
2
0
#1
вот задание: Ввести строку из цифр и если ее длина >6, удалить из нее цифры, кратные 3, записав их в другую строку.
Вопрос в том, что перевести из char в int у меня получилось, убрать числа кратные трем тоже вроде не проблема, а вот записать преобразованный массив int в строку char не получается... Вот код который работает до преобразования в char ( получается массив str1 нужно преобразовать в строку char str2, и как я понимаю нужно каждый элемент массива str1 сначала преобразовать в элемент char, а потом все это записать в строку, и еще, избежать вот такого преобразования str2=str1+48):

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <string.h>
#include <ctype.h>

void f(char*, char*, int*, int*);

void main()
{
char *str, *str2;
int i, *str1, *n1, dlina;
n1=&dlina;
setlocale(LC_CTYPE, "RUSSIAN");
str = (char *)malloc((100)*sizeof(char)); // Динамическое выделение памяти
str1 = (int *)malloc((100)*sizeof(int));
str2 = (char *)malloc((100)*sizeof(char));
printf("Введите строку: "); // Вводим строку
scanf("%s",str);
dlina=strlen(str); // Длина строки

if(dlina>6) // Если длина строки больше 6, ищем числа кратные трем
{
printf("\nИсходная строка %s \n", str);

f( str2, str, str1, n1);
printf("\n");
}
else
{
printf("\nКоличество символов меньше 6\n");
printf("\nСтрока не требует преобразования %s", str);
}
free(str);
free(str1);
free(str2);
}
void f(char* str2, char* str, int* str1, int* n1)
{int i, p;
char ch;
printf("Преобразованная строка\n");
for (i=0; i<*n1; i++)
{
ch=*(str+i);// присваиваем ch значение i-го элемента строки str
str1=atoi(&ch);// переводим значение ch в тип int
if ((*(str1+i))%3>0)// выводим элементы массива без элементов кратных 3
printf("\t %d", *(str1+i));
}
}
 

kingl

New member
30.10.2013
2
0
#3
http://www.cplusplus.com/reference/cstdlib/itoa/?kw=itoa
мне просто интересно,а как вы функцию atoi нашли?_)
Я читал эту тему, но не получается у меня применить itoa, или я такой тупой, или я уже просто пересидел за компом) преобразовывает но выводится ерунда какая-то(

Добавлено: и вот мой кусок кода с itoa:


void f(char* str2, char* str, int* str1, int* n1)
{int i, p;
char ch;
for (i=0; i<*n1; i++)
{
ch=*(str+i);
str1=atoi(&ch);
if ((*(str1+i))%3==1)
p=*(str1+i);
itoa(p,(str2+i),10);
}str2[*n1]='\0';
printf("Преобразованная строка %s \n", str2);
}
 

kingl

New member
30.10.2013
2
0
#5
Алилуя) я сделал эту задачу, но мне не нравится что много массивов, сейчас попробую сократить код, а вот рабочий код:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <string.h>
#include <ctype.h>

void f(char*, char*, int*, int*, int*);

void main()
{
char *str, *str2;
int i, *str1, *str11, *n1, dlina;
n1=&dlina;
setlocale(LC_CTYPE, "RUSSIAN");
str = (char *)malloc((100)*sizeof(char)); // Динамическое выделение памяти
str1 = (int *)malloc((100)*sizeof(int));
str11 = (int *)malloc((100)*sizeof(int));
str2 = (char *)malloc((100)*sizeof(char));

printf("Введите строку: "); // Вводим строку
scanf("%s",str);
dlina=strlen(str); // Длина строки

if(dlina>6) // Елси длин строки больше 6, ищем числа кратные трем
{
printf("\nИсходная строка %s \n", str);

f( str2, str, str1, str11, n1);
}

else
{
printf("\nКоличество символов меньше 6\n");
printf("\nСтрока не требует преобразования %s", str);
}

free(str);
free(str1);
free(str2);
}
void f(char* str2, char* str, int* str1, int* str11, int* n1)
{int i, p, k=0;
char ch;
for (i=0; i<*n1; i++)
{
ch=*(str+i);
str1=atoi(&ch);
if ((*(str1+i))%3>0)
{*(str11+k)=*(str1+i);
k++;}
}
for (i=0; i<*n1; i++)
{ p=*(str11+i);
itoa(p,(str2+i),10);}
str2[k]='\0';
printf("Преобразованная строка %s \n", str2);
}
 

kingl

New member
30.10.2013
2
0
#6
Вот конечный вариант, может кому полезно будет, потому что на эту тему я мало совсем понятных примеров нашел:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <string.h>
#include <ctype.h>

void f(char*, char*, int*, int*);

void main()
{
char *str, *str2;
int i, *str1, *n1, dlina;
n1=&dlina;
setlocale(LC_CTYPE, "RUSSIAN");
str = (char *)malloc((100)*sizeof(char)); // Динамическое выделение памяти
str1 = (int *)malloc((100)*sizeof(int));
str2 = (char *)malloc((100)*sizeof(char));

printf("Введите строку: "); // Вводим строку
scanf("%s",str);
dlina=strlen(str); // Длина строки

if(dlina>6) // Елси длин строки больше 6, ищем числа кратные трем
{
printf("\nИсходная строка %s \n", str);

f( str2, str, str1, n1);
}

else
{
printf("\nКоличество символов меньше 6\n");
printf("\nСтрока не требует преобразования %s", str);
}

free(str);
free(str1);
free(str2);
}
void f(char* str2, char* str, int* str1, int* n1)
{int i, p,z, k=0, l=0;
char ch;
for (i=0; i<*n1; i++)
{
ch=*(str+i);
str1[k]=atoi(&ch);//Преобразование char в int
k++;}
for (z=0; z<k; z++) {
if ((*(str1+z))%3>0)//Удаляем элементы кратные 3
{p=*(str1+z);
itoa(p,(str2+l),10);//преобразование массива int в строку char
l++;}
}

str2[z]='\0';
printf("Преобразованная строка %s \n", str2);
}
 
R

rrrFer

#7
вот задание: Ввести строку из цифр и если ее длина >6, удалить из нее цифры, кратные 3, записав их в другую строку.
C++:
string str;
cin >> str; // ввели строку, но может быть не только из цифр
if (str.end() != find_if(str.begin(), str.end(), [](char c) { return c < '0' || c > '9'; })
return 1; // в строке не только цифры
if (str.length() < 6)
return 0; // если длина меньше 6 - ничего делать не надо?
string str2; // новая строка, в которой будут цифры не кратные 3

// помещаем цифры не кратные 3 в новую строку
for (auto t : str) 
if ((t - '0') % 3)
str2 += t;

// удаляем цифры не кратные трем
remove_if(str.begin(), str.end(), [](char c) { return (c - '0') % 3; });

// еще что-то? )
Вообще криво кнешно удалять символы из середины строки (со сдвигом) - правильнее создать новую строку - тогда remove_if не нужен - все делается в одном цикле...

Код:
for (auto t : str) 
if ((t - '0') % 3) str2 += t;
else str3 += t;
 

kingl

New member
30.10.2013
2
0
#8
Спасибо) Но я еще только учусь, много не понятного в коде, но я разберусь)