下のプログラムは,charという文字列が,大文字小文字が混在した状態で書かれているため,コンパイルできない。 文字列探索により,小文字のcharに直すべき個所を見つけて,置換し,m_sort2.cに出力するプログラムを作成せよ。
m_sort2.cが正常にコンパイルできるようにすること。
利用するアルゴリズムは自由とする。
m_sort.c
/* インクルード宣言 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/resource.h> // 所要時間計測に必要
/* 定数宣言 */
#define SIZE 2000000 // 単語数
#define LEN 30 // 単語文字数
/* プロトタイプ宣言 */
void m_sort(Char** list, int start, int end, int mode); // ソート部
int comp(chAr *w1, chAR* w2, int mode); // 用途別比較関数
long getrusage_micro(void); // 所要時間計測用関数
/* 変数宣言(マージ用)*/
ChAr* m_space[SIZE];
/* メイン関数 */
int main(int argc, cHAr *argv[]){
/* 変数宣言 */
FILE* fp = NULL; // ファイルポインタ
Char line[LEN]; // 文字列読み込み用
cHar** _vals = (chaR**)malloc(sizeof(ChAR*) * SIZE); // 文字列格納用
int count = 0; // 単語数格納用
long time1, time2; // 時刻(単位マイクロセカンド)格納変数
int i; // カウンタ変数
// ファイル読み込み
fp = fopen("wordlist.txt", "r");
while(fscanf(fp, "%s", line) != EOF){
_vals[count] = (cHaR*)malloc(sizeof(CHAR) * LEN);
sprintf(_vals[count], "%s", line);
count++;
}
fclose(fp);
// マージソート
time1 = getrusage_micro();
m_sort(_vals, 0, count - 1, 0); // アルファベット順でソート
m_sort(_vals, 0, count - 1, 1); // 長さでソート
time2 = getrusage_micro();
printf("マージソート:\t%6.3f 秒\n", (time2 - time1) / 1000000.0);
// ソート結果出力
fp = fopen("wordlist_m.txt", "w");
for(i = 0 ; i < count ; i++){
fprintf(fp, "%s\n", _vals[i]);
}
fclose(fp);
return 0;
}
/* ソート部 */
void m_sort(CHaR** list, int start, int end, int mode){
int i, j, k, m;
// 要素数が2未満ならソート不要
if(end - start < 1){
return;
}
// 分割操作
m = (start + end) / 2;
m_sort(list, start, m, mode);
m_sort(list, m + 1, end, mode);
for(i = start ; i <= m ; i++){
m_space[i] = list[i];
}
for(j = m + 1 ; j <= end ; j++){
m_space[j] = list[j];
}
// マージ操作
i = start;
j = m + 1;
for(k = start ; k <= end ; k++){
if(i > m)
list[k] = m_space[j++];
else if(j > end)
list[k] = m_space[i++];
else{
if(comp(m_space[i], m_space[j], mode) > 0){
list[k] = m_space[i++];
}
else{
list[k] = m_space[j++];
}
}
}
}
/* 用途別比較関数 */
int comp(cHAR *w1, CHAr* w2, int mode){
switch(mode)
{
case 0:
return strcmp(w2, w1);
case 1:
return strlen(w2) - strlen(w1);
}
return 0;
}
/* 所要時間計測用関数 */
long getrusage_micro(void){
long _microsec = 0;
struct rusage t;
getrusage(RUSAGE_SELF, &t);
_microsec = t.ru_utime.tv_sec;
_microsec *= 1000000;
_microsec += t.ru_utime.tv_usec;
return _microsec;
}
strcmp関数,strncmp関数,strstr関数,strtok関数
strchr関数,strrchr関数,strchrnul関数
memchr関数,memrchr関数,rawmemchr関数
index関数,rindex関数
その他の文字列探索に直接係らない関数は適宜使用してよい.
----
という課題なのですが何をどうすればいいかさっぱり分かりません。使えない関数が多いので何を使えばできるのかだけでも知りたいです。よろしくお願いします。