Я хочу получить число 1s (как символ) во входной строке, но не работает. Пожалуйста, расскажи мне причину.
#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 in the string \"" << s << "\" is: " << n << "\n";
}
Нажмите здесь для демонстрации.
Если ваш компилятор не поддерживает C++ 11, замените auto
на std::size_t
.
Старомодный "C":
int ch ;
int count = 0 ;
while ((ch = getchar()) != EOF)
{
if (ch == '1')
count += 1 ;
} ;
(Непроверенный!)
'\0'
) защищенных символов.scanf
, потребляется в gets
.n
.gets
может привести к переполнению. (Это устарело)Эта:
char a[n];
gets(a);
неверно, это слишком маленький буфер, так как нет места для терминатора, который gets()
туда.
Никогда не делай этого. На самом деле никогда не используйте gets()
для чего-либо.
Вместо этого
char line[256];
if(fgets(line, sizeof line, stdin) != NULL)
{
printf("read a line, process here\n");
}
std::cin
и алгоритмы. Это будет намного проще.