Я пытаюсь написать программу на 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), так что это не должно быть проблемой и в моем коде.
хотя я знаю, что этот вопрос можно легко решить с помощью массивов, я хотел бы знать, что я делал неправильно, чтобы избежать подобных ошибок в будущем.
Когда вы делаете 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 Ты прав, мой плохой
Код без объяснения не является ответом.
Каждый из этих
strcmp(&s[i], "N") == 0
звонков должен бытьs[i] == 'N'
. Я не думаю, что вы понимаете, как работаетstrcmp
.