LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

int main(int argc, char * * argv) {
  char buf[1000], *p;
  unsigned int n, j;
  n = atoi(argv[1]);
  while(fgets(buf, sizeof(buf), stdin)) {
    for(j=0,p=buf; j<=n && (p=strchr(p,'+')); j++,p++);
    if(j==n) fputs(buf, stdout);
  }
}

разумеется, для продакшн-качества надо избавиться от фиксированной максимальной длины строки (1000) и проверять что argv[1] это действительно число а не мусор, и проверять чтобы j не переполнилось, если n==(unsigned)-1 и мы нашли больше совпадений, ну и добавить поддержку строк в файле, которые не влезают в память (например строка длиной 10ГБ на 32-бит платформе; подозреваю grep такое тоже не поддерживает)

Исправление firkax, :

int main(int argc, char * * argv) {
  char buf[1000], *p;
  unsigned int n, j;
  n = atoi(argv[1]);
  while(fgets(buf, sizeof(buf), stdin)) {
    for(j=0,p=buf; j<=n && (p=strchr(p,'+')); j++,p++);
    if(j==n) fputs(buf, stdout);
  }
}

разумеется, для продакшн-качества надо избавиться от фиксированной максимальной длины строки (1000) и проверять что argv[1] это действительно число а не мусор

Исходная версия firkax, :

int main(int argc, char * * argv) {
  char buf[1000], *p;
  int n, j;
  n = atoi(argv[1]);
  while(fgets(buf, sizeof(buf), stdin)) {
    for(j=0,p=buf; p=strchr(p,'+'); j++,p++);
    if(j==n) fputs(buf, stdout);
  }
}