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

Тема в разделе "C/C++/C#", создана пользователем kingl, 30 окт 2013.

  1. kingl

    kingl New Member

    Регистрация:
    30 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    вот задание: Ввести строку из цифр и если ее длина >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));
    }
    }
     
  2. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
  3. kingl

    kingl New Member

    Регистрация:
    30 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    Я читал эту тему, но не получается у меня применить 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);
    }
     
  4. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
  5. kingl

    kingl New Member

    Регистрация:
    30 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    Алилуя) я сделал эту задачу, но мне не нравится что много массивов, сейчас попробую сократить код, а вот рабочий код:

    #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);
    }
     
  6. kingl

    kingl New Member

    Регистрация:
    30 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    Вот конечный вариант, может кому полезно будет, потому что на эту тему я мало совсем понятных примеров нашел:

    #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);
    }
     
  7. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Код (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 не нужен - все делается в одном цикле...

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

    kingl New Member

    Регистрация:
    30 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    Спасибо) Но я еще только учусь, много не понятного в коде, но я разберусь)
     
Загрузка...

Поделиться этой страницей