Я хочу получить число 1 (как символ) во входной строке, но оно не работает. Пожалуйста, расскажите мне причину.
#include"stdio.h"#include"string.h"
int main()
{
int n,l,count1=0,i;
scanf("%d",&n);
char a[n];
gets(a);
for(i=0;i<n;i++)
{
if(a[i]=='1')
count1++;
}
printf("%d",count1);
puts(a);
return 0;
}
Ваш код пропустит gets () из-за введенного ранее символа новой строки, символ новой строки является разделителем для метода gets (). хотя использование getchar () сразу после scanf должно работать, но я рекомендую использовать это
#include"stdio.h"#include"string.h"#include <iostream>
int main()
{
int n,l,count1=0,i;
scanf("%d",&n);
char a[n];
std::cin>>a;
for(i=0;i<n;i++)
{
if(a[i]=='1')
count1++;
}
printf("%d",count1);
std::cout<<a;
return 0;
}
Вы пометили этот вопрос с помощью C ++, и есть простой способ решить эту проблему в C ++:
#include <algorithm> // for std::count
#include <iostream> // for std::cin and std::cout
#include <string> // for std::string
int main()
{
std::string s;
std::cin >> s; // reading in the string
auto n = std::count(s.cbegin(), s.cend(), '1'); // counting '1' characters
std::cout << "the number of '1's in the string \"" << s << "\" is: " << n << "\n";
}
Нажмите здесь для демонстрации.
Если ваш компилятор не поддерживает C ++ 11, тогда замените auto
от std::size_t
,
'\0'
) персонажи обеспечены.scanf
потребляется в gets
, n
,gets
возможно, вызвало переполнение. (Устарело)Старомодный ‘C’:
int ch ;
int count = 0 ;
while ((ch = getchar()) != EOF)
{
if (ch == '1')
count += 1 ;
} ;
(Не проверено!)
Это:
char a[n];
gets(a);
неправильно, это слишком маленький буфер, так как нет места для терминатора, который gets()
положу туда.
Никогда не делай этого. На самом деле, никогда не используйте gets()
для всего.
Вместо этого делай
char line[256];
if(fgets(line, sizeof line, stdin) != NULL)
{
printf("read a line, process here\n");
}