文字列処理で詰まったこと

詰まってた問題が解決したのでメモ.

最近,J1のときにやった問題を解き直してるんだけど,こういう問題にあたった.
 
以下に示す顔を表示するプログラムを作成せよ.ただし,配列は14×14とし,配列の値が1のとき■を出力し,0のとき□を出力することで絵を作成せよ.
□□□□■■■■■■□□□□
□□□■□□□□□□■□□□
□□■□□□□□□□□■□□
□■□□□□□□□□□□■□
□■□■■■□□■■■□■□
■□□□□□□□□□□□□■
■□□□■□□□□■□□□■
■□□□□□□□□□□□□■
■□□■■■■■■■■□□■
□■□□■□□□□■□□■□
□■■□□■■■■□□□■□
□□■□□□□□□□□■□□
□□□■□□□□□□■□□□
□□□□■■■■■■□□□□
 
要するに配列で0,1を保存してそれを使って顔を描けって感じ.
これを0,1で配列に入れるのに,□■で書かれた顔を0,1に変換するプログラムをささっと書こうと思った.
 
作ろうとしたプログラム
入力
□□□□■■■■■■□□□□
□□□■□□□□□□■□□□
□□■□□□□□□□□■□□
□■□□□□□□□□□□■□
□■□■■■□□■■■□■□
■□□□□□□□□□□□□■
■□□□■□□□□■□□□■
■□□□□□□□□□□□□■
■□□■■■■■■■■□□■
□■□□■□□□□■□□■□
□■■□□■■■■□□□■□
□□■□□□□□□□□■□□
□□□■□□□□□□■□□□
□□□□■■■■■■□□□□
出力
0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,…..
 
最初にgetchar()で一文字ずつ取得して処理しようとした.でも■□はUnicodeで多バイト文字だから動かなかった.
次に,getwchar()を使おうとした.でもワイド文字じゃダメだった.
その次は,文字列で処理しようとしたけど,strcmp()とかstrcpy()がなんかおかしい.
結果,こんなんになった.
 

#include <stdio.h>
#include <string.h>
int main(){
	char c[8];
	char pattern[8]="%3s";
	pattern[1]=strlen("■")+0x30;
	while(scanf(pattern,c)!=EOF){
		if(!strcmp(c,"■")){
			printf("1");
		}else if(!strcmp(c,"□")){
			printf("0");
		}else{
			continue;
		}
		printf(",");
	}
	return 0;
}

 
□が何バイトになるかわからないから,strlen()でバイト数をとってからscanf()で一文字分取得する感じ.もっと簡単な方法はなかったのか……
まあ,これでうごいたしこれでいいかな,って.
 
おまけ
実はCで詰まったときにJavaでもつくった.
 

import java.util.Scanner;
public class Test{
	public static void main(String[] args){
		Scanner stdIn = new Scanner(System.in);
		char c;
		String str;
		while(stdIn.hasNext()){
			str=stdIn.next();
			for(int i=0;i<str.length();i++){
				c=str.charAt(i);
				if(c=='□'){
					System.out.print("0");
				}else if(c=='■'){
					System.out.print("1");
				}else{
					continue;
				}
				System.out.print(",");
			}
		}
	}
}

 
ロジックが同じだし,同じ動作をする.
でも,Javaでしか作れないっていうのは悔しかったからCでもつくった.
 
愚痴
CでもJavaでもなんでも,文字コードを意識しなきゃいけないのとってもめんどい.
めんどいからUnicode以外は世界から消えて欲しい…
あとなんでjava.util.ScannerにnextChar()みたいなのないの