Что не так с этим кодом C? Я хочу знать количество 1 во входной строке

0

Я хочу получить число 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;
}
  • 0
    использовать std::cin и алгоритмы. Это будет намного проще.
  • 4
    Да, первый вопрос: хотите ли вы сделать это на C или C ++.
Показать ещё 5 комментариев
Теги:
string
scanf
gets

5 ответов

2

Ваш код будет пропускать 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;
}
  • 0
    это код на C, поэтому std :: cin и std :: cout и iostream недоступны.
  • 0
    Это код на C, поэтому определение переменной в стеке доступно только сразу после '{', поэтому OP должен использовать компилятор C ++. Тем не менее, это не действительный код C.
Показать ещё 1 комментарий
1

Вы отметили этот вопрос с помощью 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.

0

Старомодный "C":

int ch ;
int count = 0 ;
while ((ch = getchar()) != EOF)
  {
    if (ch == '1')
      count += 1 ;
  } ;

(Непроверенный!)

0
  1. Он не учитывает Конец строки ('\0') защищенных символов.
  2. фактический ввод не является новой линией, введенной в scanf, потребляется в gets.
  3. Количество введенных символов может быть меньше n.
  4. gets может привести к переполнению. (Это устарело)
0

Эта:

char a[n];
gets(a);

неверно, это слишком маленький буфер, так как нет места для терминатора, который gets() туда.

Никогда не делай этого. На самом деле никогда не используйте gets() для чего-либо.

Вместо этого

char line[256];

if(fgets(line, sizeof line, stdin) != NULL)
{
  printf("read a line, process here\n");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню