CPP

技巧

IO优化

在保证不混用cin/scanf,cout/prinf情况下 关闭Cpp与C的IO同步

std::ios::sync_with_stdio(false)

解除输入与输出的关联

std::cin.tie(nullptr)

注意

程序(C)

单词计数

#include <stdio.h>
#define IN 1
#define OUT 0
int main() {
  int lines = 0;
  int words = 0;
  int stat = OUT;
  char c;
  while ((c = getchar()) != EOF) {
    if (c == '\n') {
      ++lines;
    }
    if (c == ' ' || c == '\n' || c == '\t') {
stat = OUT;
      putchar('\n');
    } else if (stat == OUT) {
	stat = IN;
	++words;
      }
    
    
  }
  printf("words: %d,lines: %d",words,lines);
}

单词长度直方图

#include <stdio.h>
#define IN 1
#define OUT 0
int main() {
  int lines = 0;
  int words = 0;
  int stat = OUT;
  int words_len = 0;
  char c;
  while ((c = getchar()) != EOF) {
    if (c == ' ' || c == '\n' || c == '\t') {
      if (stat == IN) {
	while (words_len > 0) {
	  putchar('-');
	  --words_len;
	}
      }
      stat = OUT;
      
    } else {
      if (stat == OUT) {
	stat = IN;
        ++words;
	putchar('\n');
      }
      putchar(c);
      ++words_len;
      
    }
  }

  if (stat == IN) {
    while (words_len > 0) {
      putchar('-');
      --words_len;
    }
  }
}

字符计数

#include <stdio.h>
#define IN 1
#define OUT 0
int main() {
  int lines = 0;
  int words = 0;
  int stat = OUT;
  int words_len = 0;
  char c;
  char set[127];

  for (int i=48;i<127;++i) {
    set[i] = 0;
  }

  while ( (c = getchar()) != EOF) {
    ++set[c^0];
  }
  printf("\n Character[ANSI]:count");
  for (int i = 48; i < 127; ++i) {
    printf("\n %c[%d]:%d",i,i,set[i]);
  }
}

最大的行

#include <stdio.h>
#define IN 1
#define OUT 0
#define MAX 1000
int _getline(char s[],int lim) {
  int i = 0;
  char c;
  while (i < lim -1 &&(  c = getchar()) != EOF && c != '\n') {
    s[i] = c;
    ++i;
  }
  if (c == '\n') {
    s[i] = c;
    ++i;
  }
  s[i] = '\0';
  return i;
}
void copy(char from[], char to[]) {
  int i = 0;
  while (from[i] != '\0') {
    to[i] = from[i];
    ++i;
  }
  to[i] = '\0';
}
int main() {
  char c;
  char string[MAX];
  int len = 0;
  int max_len = 0;
  char max[MAX];
  while ((len = _getline(string, MAX)) > 0) {
    printf("%d",len);
    if (len > max_len) {
      copy(string, max);
      max_len = len;
      }
  }
  printf("%s",max);
}

截断尾部空白

void delete_tail_whitespace(char s[], int len) {
  int index = len -1;
  int add =0;
  if (s[index] == '\n' && index == 0) {
    s[index] = '\0';
	return ;
  }
  if (s[index] != '\n') {
    add = 0;
  } else {add = 1;}
  while (index > 0 && (s[index] == ' '|| s[index] == '\t' || s[index] == '\n')) {
    s[index] = '\0';
    --index;
  }
  if (add == 1) {
    s[(++index)] = '\n';
  }
}

制表换空格

行处理

int _getline_detab(char s[],int max){
  char c;
  int i = 0;
  while (i < max - 1 && ((c = getchar()) != EOF) && c != '\n') {
if (c != '\t'){
	s[i] = c;
	++i;
      } else {
	int count = 8 - (i % 8);
	while (count >0) {
	  s[i] = ' ';
	  ++i;
	  --count;
	}
      }
  }
  if (c == '\n') {
      s[i] = '\n';
      ++i;
    }
  s[i] = '\0';
  return i;
}

逐字处理


void detab(char s[]){
  int c;
  int count = 0; 
  int pos = 0;
  while ( (c = getchar()) != EOF){
    if (c == '\t'){
      pos %= 8;
      count = 8 - pos;
      while (count >0) {
	putchar(' ');
	--count;
      }
      pos =0;
    } else  {
      putchar(c);
      ++pos;
	  if (c == '\n') {
		  pos = 0;
	  }
    }

  }
}