C言語 英単語の並び替え

/*
 ・30個以内の英単語(半角英数字)を入力して入力順に配列に格納する。
 ・入力終了後に昇順に文字列をソートする。
 ・英単語の入力文字列は半角20文字までとする。
 ・入力した英単語の個数とソート前の英単語およびソート後の英単語を出力する。
 ・文字列の入力終了はEOFとする。
 */
#include <stdio.h>
#include <string.h>
int str_cmp(char *p, char *pp);
int main(void) {
	int i, j, n = 0;
	char str[30][20];
	char tmp[20];

	printf("***昇順に文字列をソートするプログラム***\n");
	printf("30個以内で英単語を入力してください\n");
	/*************読み込み***************/
	for (i = 0; i < 30; i++) {
		if (scanf("%s", tmp) == EOF)
			break;
		if (strlen(tmp) > 20) {
			printf("文字が長過ぎます\n");
			i--;
		} else {
			strcpy(str[i], tmp);
		}
		n = i + 1; //データ個数
	}
	/**********並び替え前データの出力***********/
	printf("データ個数は%d\n", n);
	printf("並び替え前\n");
	for (i = 0; i < n; i++) {
		printf("%s\n", str[i]);
	}
	/********並び替え***********/
	for (i = 0; i < n - 1; i++) {
		for (j = i + 1; j < n; j++) {
			if (str_cmp(str[i], str[j]) > 0) {
				strcpy(tmp, str[i]);
				strcpy(str[i], str[j]);
				strcpy(str[j], tmp);
			}
		}
	}
	/***********並び替え後データの出力************/
	printf("並び替え後\n");
	for (i = 0; i < n; i++) {
		printf("%s\n", str[i]);
	}
}
/*文字列比較改良型(大文字と小文字を同じと見做す)**/
int str_cmp(char *p, char *pp) {
	char s, ss;
	for (;;) {
		s = *p;
		ss = *pp;
		if (s == ss) {
			p++;
			pp++;
		}
		if (*p >= 0x41 && *p <= 0x5A) {
			s += 32;
			if (s == ss) {
				p++;
				pp++;
			}
		}
		if (*pp >= 0x41 && *pp <= 0x5A) {
			ss += 32;
			if (s == ss) {
				p++;
				pp++;
			}
		}
		if (*p == '\0')
			return 0;
		if (s != ss)
			return s - ss;
	}
}

DUO 3.0

DUO 3.0