Цикл for печатает только последнюю итерацию

Я пытаюсь написать программу на C, которая принимает ввод строки от пользователя, а затем просматривает ввод, чтобы подсчитать частоту всех целых чисел в строке. Итак, предположим, что если пользователь вводит:

a11472o5t6

вывод будет:

0 2 1 0 1 1 1 1 0 0

мой подход включает сравнение каждого символа строки со всеми 10 цифрами одну за другой, и если какой-либо символ равен цифре, он увеличивает число естьdigit на 1. код, который я написал для того же, выглядит следующим образом:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int is1 = 0; //initialise integers for checking
int is2 = 0;
int is3 = 0;
int is4 = 0;
int is5 = 0;
int is6 = 0;
int is7 = 0;
int is8 = 0;
int is9 = 0;
int is0 = 0;

int main()
{
    char s[100];        //initialise array for string
    scanf("%s", s);      //scan string input

    //now all characters of the string are stored in the array s
    for (int i = 0; i < strlen(s); i++)   //loop to iterate over all the elements in the array
    {
        if (strcmp(&s[i], "0") == 0)
        {
            is0 = is0 + 1;
        }
        if (strcmp(&s[i], "1") == 0)
        {
            is1 = is1 + 1;
        }
        if (strcmp(&s[i], "2") == 0)
        {
            is2 = is2 + 1;
        }
        if (strcmp(&s[i], "3") == 0)
        {
            is3 = is3 + 1;
        }
        if (strcmp(&s[i], "4") == 0)
        {
            is4 = is4 + 1;
            //printf("%d", is4);
        }
        if (strcmp(&s[i], "5") == 0)
        {
            is5 = is5 + 1;
        }
        if (strcmp(&s[i], "6") == 0)
        {
            is6 = is6 + 1;
        }
        if (strcmp(&s[i], "7") == 0)
        {
            is7 = is7 + 1;
        }
        if (strcmp(&s[i], "8") == 0)
        {
            is8 = is8 + 1;
        }
        if (strcmp(&s[i], "9") == 0)
        {
            is9 = is9 + 1;
        }
    }
    printf("%d ", is0);
    printf("%d ", is1);
    printf("%d ", is2);
    printf("%d ", is3);
    printf("%d ", is4);
    printf("%d ", is5);
    printf("%d ", is6);
    printf("%d ", is7);
    printf("%d ", is8);
    printf("%d ", is9);
}

Я ожидал, что код будет повторяться снова и снова по всей длине строки и обновлять значения серии естьdigit каждый раз, когда число будет успешно найдено. Однако всякий раз, когда я запускаю код, кажется, что только последняя цифра находит свое место в выводе. например, если я наберу 54 в качестве ввода, ожидаемый результат будет

0 0 0 0 1 1 0 0 0 0

однако вывод, который мой код, кажется, дает

0 0 0 0 1 0 0 0 0 0

аналогично число 45 также имеет такой же ожидаемый результат

0 0 0 0 1 1 0 0 0 0

но вывод, который я получаю,

0 0 0 0 0 1 0 0 0 0

что выглядит так, как будто код перезаписывает любую операцию, которая произошла в предыдущей итерации, но я не могу понять, почему и как это исправить.

Со своей стороны, я проверил, правильно ли вызываются символы один за другим и сравниваются ли все символы, где я не обнаружил проблем. Я также искал другие ответы о переполнении стека и в других местах, но был ли я новичком, и большинство ответов были написаны со ссылкой на языки, которые я не понимаю, поэтому я не мог относиться к решению, которое им было сказано. самое близкое, что я нашел, это кто-то, кто повторно использовал одну переменную, перезаписывая ее на каждой итерации. однако я объявил достаточно переменных (по одной для каждой цифры от 0 до 9), так что это не должно быть проблемой и в моем коде.

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

Каждый из этих strcmp(&s[i], "N") == 0 звонков должен быть s[i] == 'N'. Я не думаю, что вы понимаете, как работает strcmp.

WhozCraig 10.04.2022 11:08
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
1
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы делаете if (strcmp(&s[i],"1")==0), вы сравниваете строки, а не отдельные символы, поэтому учитывается только последний символ. Это единственное совпадение.

Пример:

Если s == "a11472o5t6" и вы используете strcmp(&s[1], "1"), вы сравниваете строку "11472o5t6" со строкой "1", которая явно не будет равна.

Вы хотите, чтобы if(s[i] == '1') и т. д. вместо этого выполняли сравнения отдельных символов.

И вы правы в использовании вместо этого массивов. Было бы конечно проще.

Пример:

#include <ctype.h>
#include <stdio.h>

int main() {
    const char *str = "a11472o5t6";

    int ints[10] = {0};

    for (const char *chptr = str; *chptr != '\0'; ++chptr) {
        if(isdigit((unsigned char) *chptr)) ++ints[*chptr - '0'];
    }

    for (int i = 0; i < 10; ++i) printf("%d %d\n", i, ints[i]);
}

Выход:

0 0
1 2
2 1
3 0
4 1
5 1
6 1
7 1
8 0
9 0

Попробуй это:

#include <stdio.h>
#include <string.h>

int main(){
    char s[100];
    scanf("%s",s);
    char arr1[10] = {'0','1','2','3','4','5','6','7','8','9'};
    int arr2[10] = {0};

    for(int i = 0; i < strlen(s);i++){
        for(int j = 0; j < 10; j++){
            if(s[i] == arr1[j])
                arr2[j]++;
        }
    }

    for(int i = 0; i < 10; i++)
        printf("%d ", arr2[i]);
}

Предложения: scanf("%s",s) -> if (scanf("%99s",s) != 1) return 1; и i < strlen(s) -> s[i] != '\0'

chqrlie 10.04.2022 11:33

Вы не отвечаете на вопрос ОП: хотя я знаю, что этот вопрос можно легко решить с помощью массивов, я хотел бы знать, что я делал неправильно, чтобы избежать подобных ошибок в будущем.

chqrlie 10.04.2022 11:34

@chqrlie Ты прав, мой плохой

Ali 10.04.2022 11:37

Код без объяснения не является ответом.

Eric Postpischil 10.04.2022 12:38

Другие вопросы по теме