Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
3 / 2 / 1
Регистрация: 12.10.2017
Сообщений: 214
1

Пользовательский ввод символьного типа char

20.08.2018, 14:04. Показов 6560. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я написал код который проверяет есть ли в в последовательности "0123456789" числа "123" и есть ли они есть то с какой они позиции начинаются. Но мне хочется чтобы я не в программе задавал числа 123 для проверки а чтобы пользователь их задавал в консоли, как мне это сделать ?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <string.h>
#include <locale.h>
int main(void) {
    setlocale(LC_ALL,"ru");
    char str[11] = {'0','1','2','3','4','5','6','7','8','9','\0'};
    int count,i;
    int ch='1';
    char *ach;
    printf("Элементы массива: ") ;puts(str);
    printf("Есть ли внутри массива последовательность 123? ");
    count = 0;
    for (i = 0; str[i] != '\0'; i++)
      {
       if (str[i] == '1' && str[i+1] == '2' && str[i+2] == '3')
        count++;
    }
    if (count>0){
        printf("Она есть\n");
        ach=strchr (str,ch);
        printf ("Последовательнсть 123 начинается с позиции №%i\n",ach-str+1);}
 
    else
        printf("Ее нет\n");
    
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2018, 14:04
Ответы с готовыми решениями:

Const char нельзя присвоить сущность типа char
Здравствуйте! Начинаю изучать Си И вот у меня немного не получается написать свою первую...

Динамический массив символьного типа - трудности
Здравствуйте! Во время выполнения задания &quot;Создать структуру &lt;студент&gt; с полями: Студ.код, Фамилия,...

Получить из переменной типа uint32_t* переменную типа char*
Всем добрый день. Помогите получить из переменной типа uint32_t* переменную типа char*. Заранее...

Преобразование массива типа char в массив типа float
Хорош ли следующий способ преобразования массива типа char в массив типа float? #include...

13
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
20.08.2018, 14:21 2
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main (void)
{
    char str[11];
    printf("input 10 symbols, please: ");
    scanf("%10s", str);
 
    printf("your word is: %s\n", str);
    return 0;
}
в 7 строке число в %10s указывает максимальное количество символов с потока ввода, которое будет прочитано, т.е. если будет введено 20 символов, в массив будут записаны только первые 10.
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
20.08.2018, 14:36 3
Или fgets
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main ()
{
    char str[11];
    printf("input 10 symbols, please: ");
    fgets(str,10,stdin);
    printf("your word is: %s\n", str);
    
    return 0;
}
0
3 / 2 / 1
Регистрация: 12.10.2017
Сообщений: 214
20.08.2018, 15:23  [ТС] 4
Peoples, stake-k26, вы не поняли меня ) мне не нужно менять 0123456789 мне нужно чтобы менялись значения "123" на "567" и после того как я их ввел они проверялись на наличие в последовательности 0123456789
0
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
20.08.2018, 16:38 5
Цитата Сообщение от SkyLark_71 Посмотреть сообщение
мне хочется чтобы я не в программе задавал числа 123 для проверки а чтобы пользователь их задавал в консоли, как мне это сделать
Цитата Сообщение от SkyLark_71 Посмотреть сообщение
мне не нужно менять 0123456789 мне нужно чтобы менялись значения "123" на "567"
А еще я хочу синих грибочков...

Добавлено через 44 минуты
SkyLark_71, нет никакой разницы сколько символов вы будете вводить 10 или 3, ввод всегда одинаков. Что касается проверки

if (str[i] == '1' && str[i+1] == '2' && str[i+2] == '3')

то вместо конкретных символов, вы указываете элементы массива. Например:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int main (void)
{
    char str[6] = {'1', '2', '1', '2', '3', '\0'};
    char sym[4] = {'1', '2', '3', '\0'};
 
    int i, k, chek;
    for (i=0; str[i] != '\0'; i++)
    {
        chek = 1;               // изначально предполагаем, что совпадают
        for (k=0; sym[k] != '\0' && chek != 0; k++)
        {
            if (sym[k] != str[i+k])
                chek = 0;       // если не совпадают, выходим из цикла проверки
        }
 
        if (chek > 0)           // если после проверки результат положительный
            printf("%d\n", i);  // выводим позицию где найдено совпадение
    }
 
    return 0;
}
и в этом случае не важно какой из массивов вы вводите с клавиатуры. Будь то str или sym - вводятся они одинаково, вам только нужно учитывать количество символов в массиве.

На что вам стоит обратить внимание, так это на то, что при проверке
if (sym[k] != str[i+k])
мы не проверяем не выйдет ли число i+k за границы массива str, а это стоит учитывать, подумайте на досуге.

Добавлено через 25 минут
SkyLark_71, и вот еще что, вам по заданию нужно написать такую программу или вы просто сами себе задачу придумали? Если сами себе, то почитайте на досуге: strstr.
0
3 / 2 / 1
Регистрация: 12.10.2017
Сообщений: 214
21.08.2018, 13:12  [ТС] 6
stake-k26, по заданию - Задан массив (char A[N], элементы которого могут быть заполнены только
(’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’)). Определить входит ли в него последовательность
символов '123', если да, то с какой позиции (N>3).
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
21.08.2018, 16:55 7
Цитата Сообщение от SkyLark_71 Посмотреть сообщение
C
1
char str[11] = {'0','1','2','3','4','5','6','7','8','9','\0'};
это что? мазохизм?
так не проще?
C
1
char str[11] = "0123456789";
0
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
21.08.2018, 18:03 8
Лучший ответ Сообщение было отмечено SkyLark_71 как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
 
int check (char * a, char * b)
{
    int i, k, z;
    for (i=0; a[i]; ++i)
    {
        for (k=0, z=1; b[k] && z; ++k)
            if (!a[i+k]) z = 0;
            else if (b[k] != a[i+k]) z = 0;
 
        if (z > 0) return i;
    }
 
    return -1;
}
 
int main (void)
{
    char * str = "0123456789";
    char sym[4];
 
    printf("input 3 symbols, please: ");
    scanf("%3s", sym);
 
    int pos = check(str, sym);
 
    if (pos >= 0)
        printf("position is %d\n", pos);
    else
        printf("symbols %s not found in %s\n", sym, str);
 
    return 0;
}
1
3 / 2 / 1
Регистрация: 12.10.2017
Сообщений: 214
21.08.2018, 20:42  [ТС] 9
stake-k26, объясните, пожалуйста, а для чего служит второй цикл вот здесь ? я просто не пойму
C
1
2
3
4
5
6
7
8
 for (i=0; str[i] != '\0'; i++)
    {
        chek = 1;               // изначально предполагаем, что совпадают
        for (k=0; sym[k] != '\0' && chek != 0; k++)
        {
            if (sym[k] != str[i+k])
                chek = 0;       // если не совпадают, выходим из цикла проверки
        }
Вот это часть я так понимаю проверяет не выйдет ли число i+k за границу массива?
C
1
if (!a[i+k]) z = 0
0
482 / 270 / 57
Регистрация: 08.10.2015
Сообщений: 1,158
21.08.2018, 21:42 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main(void)
{
setlocale(LC_ALL,"ru");
char str[11] = {'0','1','2','3','4','5','6','7','8','9','\0'};
int count=0,i;
char sa[4],sb[4];
scanf("%3s",sa); 
printf("Есть ли внутри массива последовательность %s?", sa);
for (i = 0; str[i+3] != '\0'; i++)
 {
  sprintf(sb,"%c%c%c",str[i],str[i+1],str[i+2]);
  if(!strcmp(sa,sb)) {count++; break;}
 }
if (count>0) printf("Она есть, начинается с позиции %d\n",i);
 else printf("Ее нет\n");
system("pause");
return 0;
}
Правда ищет только одно совпадение, но не сложно переделать и на несколько. Позиция считается с 0.
Ну и можно count выбросить.
0
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
22.08.2018, 02:09 11
Лучший ответ Сообщение было отмечено SkyLark_71 как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int check (char * a, char * b)
{
    int i, k, z;
    for (i=0; a[i]; ++i)                    // перебираем каждый символ в строке str
    {
        for (k=0, z=1; b[k] && z; ++k)      // перебираем каждый символ в sym
            if (!a[i+k]) z = 0;             // проверяем выход за пределы str
            else if (b[k] != a[i+k]) z = 0; // сравниваем символ sym[] с str[]
 
        if (z > 0) return i;
    }
 
    return -1;
}
SkyLark_71, мы берем каждый символ в строке str, и начиная с него, начинаем сравнивать 3 символа с символами в sym, для чего служит вложенный цикл. Если все символы совпали, значит нам встретилось совпадение и мы возвращаем найденную позицию i. Если никаких совпадений нет, мы возвращаем -1.
1
482 / 270 / 57
Регистрация: 08.10.2015
Сообщений: 1,158
22.08.2018, 02:23 12
Заметил (мне указали), что #10 озаглавлен как С++. Но в Си будет тот же код.
0
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
22.08.2018, 05:56 13
САлександр, если уж вы используете функции стандартной библиотеки из string.h, вроде strcmp, то что мешает сразу использовать strstr?:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
 
int main (void)
{
    char * c, * str = "0123456789", sym[4];
 
    printf("input 3 symbols, please: ");
    scanf("%3s", sym);
 
    if ((c = strstr(str, sym)) == NULL)
        printf("symbols %s not found in %s\n", sym, str);
    else
        printf("position is %ld\n", c-str);
 
    return 0;
}
0
482 / 270 / 57
Регистрация: 08.10.2015
Сообщений: 1,158
22.08.2018, 06:33 14
stake-k26, Вы правы, ничего не мешает, просто дело привычки . Ну и легко обобщить на случай нескольких вхождений или, например вхождений не подряд - с "зазором".
0
22.08.2018, 06:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2018, 06:33
Помогаю со студенческими работами здесь

Написать программу ввода/вывода данных целого, вещественного и символьного типа
&quot;Написать программу ввода/вывода данных целого, вещественного и символьного типа без модификаторов...

"const char *" нельзя использовать для инициализации сущности типа "char"
/* /* Написать программу, которая показывает реальное время в выбранных городах мира. Программа...

Сравнение слова символьного типа с массивом строк также символьного типа
Здравствуйте!! Ребята подскажите по такому вопросу мне нужно сравить слово символьного типа с...

Составить схему алгоритма и программу для следующего задания, используя только данные символьного типа (char)
Составить схему алгоритма и программу для следующего задания, используя только данные символьного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru