Member 12726497 Ответов: 2

Подсчет количества X чисел в числе


Я должен реализовать код, где выход - это частота числа, набранного Пользователем, в числе, также набранном пользователем . Я считаю, что мой код почти прав, просто, вероятно, что-то происходит с объявлением символа "query".
Вот код

Спасибо

Что я уже пробовал:

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

int main (void){
	int number, elements, count=0;
	char *letters, query;
	printf("Type a number so we can count: ");
	scanf("%d", &number);
	printf("How many numbers does this number have?: ");
	scanf("%d", &elements);
	printf("Which number do you want to count?: ");
	scanf("%c", &query);

	//allocate a string so we can go through a loop and count
	//the frequency of query
	letters = (char*)malloc(elements * sizeof(char));
	sprintf(letters, "%d", number);


	for (int i=0; i<elements+1; i++)
		if (letters[i] == query)
			count++;
	}

	printf("there are %d numbers\n", count);

}

Richard MacCutchan

Вы забыли сказать нам, в чем дело. Кроме того, кажется, мало смысла читать что-то в качестве int затем вам нужно снова преобразовать его в строку. Создайте разумно большой буфер, в который вы можете прочитать число в виде символов. Затем вы можете легко узнать, сколько символов находится в строке, не спрашивая пользователя.

2 Ответов

Рейтинг:
2

programify

Попробуйте выполнить следующий код:

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

int main (void)
{
     char *    cpLetters ;
     char      cQuery ;
     int       iNumber ;
     int       iDigits ;
     int       iCount ;
     int       iIndex ;

// Input numbers
     printf ("Type a number so we can count: ");
     scanf ("%d", & iNumber) ;
     printf ("How many numbers does this number have?: ");
     scanf ("%d", & iDigits) ;
     printf ("Which number do you want to count?: ");
     scanf ("%c", & cQuery) ;
// Convert number to string
     cpLetters = (char *) malloc (iDigits + 1) ;
     sprintf (cpLetters, "%d", iNumber) ;
     iCount = 0 ;
     for (iIndex = 0 ; iIndex < iDigits + 1 ; iIndex ++)
     {
          if (cpLetters [iIndex] == cQuery)
               iCount ++ ;
     }
     free (cpLetters) ;
// Show result
     printf ("There are %d digits which match the query '%c'\n", iCount, cQuery) ;
}

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

В моей системе у меня были проблемы с тем, чтобы заставить "scanf ("%c", & cQuery) ;" работать, но тогда ни один профессионал не стал бы использовать scanf() для получения данных в приложение, потому что оно такое хрупкое и непереносимое.

Также обратите внимание, что цикл for() должен увеличивать индекс, чтобы "если" мог видеть следующий символ.

Надеюсь, это поможет.
:)


Рейтинг:
0

Patrice T

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.