C言語初心者です。
別ファイルを配列に読み込んで、複数のコマンドで操作できるような下記のコードを書きました。
下記のコマンドで'a'( カーソル行の後ろに1行挿入(カーソル移動させる))について、
元々256の1行あたりの最大文字数だったのを、
1024まで増やすことができるようreallocを使って改造したいです。
文字数MOJIを1024と定義しreallocして文字数を増やしたいのですが、
下記のコンパイルエラーがでます。
演算子の不適切な利用で起こるエラーのようですが、どうしたらコンパイルが通るのか理解できず
ご指摘いただけたら幸いです。
<エラー内容>コマンドaの箇所
invalid operands to binary(have 'int' and 'int*')
moji=realloc(moji,sizeof(int)(MOJI ++moji));
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <unistd.h> 4#include <string.h> 5#include <ctype.h> 6 7#define GYO 200 //1ファイルの最大行数 8#define MOJI 1024 //1行の最大文字数 9#define LINE line+1 10 11int kansu(char* str,FILE* fp); 12 13int main(int argc,char* argv[]) 14{ 15 16FILE* fp; 17int* moji; 18char str[GYO][MOJI]; 19moji=malloc(sizeof(int)*MOJI); 20char retsu[128]; 21int i=0; 22int line=0;//現在の行番号 23int gyo; 24int k; 25line=malloc(sizeof(int)*LINE); 26line=malloc(sizeof(int)*(LINE* ++line)); 27 28 29 if(argc==2){ 30 if((fp=fopen(argv[1],"r"))==NULL){ 31 printf("ファイルが開けませんでした\n"); 32 exit(EXIT_FAILURE); 33 } 34 } 35else{ 36printf("引数の値が不正です\n"); 37exit(EXIT_FAILURE); 38} 39//strにファイルの内容読込み 40while(fgets(str[i],MOJI,fp)!=NULL){ 41//ファイルの行数チェック 42 if(i>GYO){ 43 printf("ファイルの長さが[%d]を超えました",GYO); 44 break; 45 } 46 47 if(strlen(str[i])==255){ 48 if(kansu(str[i],fp)){ 49 exit(EXIT_FAILURE); 50 } 51 printf("strlen=[%ld]\n",strlen(str[i])); 52 } 53 54 printf("%d:%s",LINE,str[line]); 55 printf("%ld\n",strlen(str[line])); 56 line++; 57 i++; 58 } 59 60 61 line--; 62 int line_max=line;//ファイル全体の行数 63 while(1){ 64 printf("コマンドを入力してください:"); 65 fgets(retsu,sizeof(retsu),stdin); 66 //大文字も小文字も対応する処理 67 for(k=0;k<strlen(retsu);k++){ 68 retsu[k]=tolower(retsu[k]); 69 } 70 //nコマンドのため 71 gyo=atoi(retsu); 72 gyo--; 73 //各コマンドの処理 74 if(strchr(retsu,'o')){ 75 for(int i=0;i<line_max;i++){ 76 if(i==line){ 77 printf("*%d:%s\n",i+1,str[i]); 78 }else{ 79 printf("%d:%s\n",i+1,str[i]); 80 } 81 } 82 printf("line:%d\n",LINE); 83 printf("line_max:%d\n",line_max+1); 84 85 }else if(strchr(retsu,'d')){ 86 if(line==0){ 87 strcpy(str[line],""); 88 printf("配列削除しました\n"); 89 }else if (line_max==line){ 90 strcpy(str[line],""); 91 line--; 92 line_max--; 93 94 }else{ 95 for(i=line;0<=(line_max-i);i++){ 96 strcpy(str[i],str[i+1]); 97 } 98 line_max--; 99 } 100 101 printf("*%d:%s\n",LINE,str[line]); 102 103 }else if(strchr(retsu,'r')){ 104 if(line<0){ 105 printf("文字列が入っていません\n"); 106 continue; 107 } 108 printf("Enter sentence:"); 109 fgets(str[line],MOJI,stdin); 110 printf("%d:%s\n",LINE,str[line]); 111 continue; 112 113 }else if(strchr(retsu,'a')){ 114 if(line<0){ 115 printf("文字列が入っていません\n"); 116 continue; 117 } 118 for(int i=line_max; i>=line; i--){ 119 strcpy(str[i+1],str[i]); 120 } 121 line_max++; 122 line++; 123 fgets(str[line],sizeof(str[line]),stdin); 124 moji=realloc(moji,sizeof(int)*(MOJI* ++moji)); 125 printf("*%d:%s\n",LINE,str[line]); 126 continue; 127 128 }else if(strchr(retsu,'i')){ 129 for(int i=line_max;i>=line;i--){ 130 strcpy(str[i+1],str[i]); 131 } 132 line_max++; 133 fgets(str[line],sizeof(str[line]),stdin); 134 printf("*%d:%s\n",LINE,str[line]); 135 136 }else if(strchr(retsu,'p')){ 137 if(line<1){ 138 printf("ファイルの先頭です\n"); 139 continue; 140 } 141 line--; 142 printf("*%d:%s\n",LINE,str[line]); 143 144 }else if(strchr(retsu,'n')){ 145 if(line>line_max){ 146 printf("最端行数を超えました\n"); 147 line=line_max; 148 } 149 line++; 150 printf("*%d:%s\n",LINE,str[line]); 151 continue; 152 153 }else if(strchr(retsu,'s')){ 154 int p=line-10; 155 if(p<1){ 156 p=1; 157 } 158 int n=line+10; 159 if(n>line_max){ 160 n=line_max; 161 } 162 for(i=p;i<=line;i++){ 163 printf("%d:%s\n",i,str[i-1]); 164 } 165 printf("*%d:%s\n",LINE,str[line]); 166 for(i=line+1;i<n+1;i++){ 167 printf("%d:%s\n",i+1,str[i]); 168 } 169 continue; 170 171 }else if(strchr(retsu,'f')){ 172char z[MOJI]; 173if(line-1<0) 174{ 175printf("入替えできません\n"); 176continue; 177} 178strcpy(z,str[line]); 179strcpy(str[line],str[line-1]); 180strcpy(str[line-1],z); 181printf("%d:%s\n",LINE,str[line]); 182continue; 183 184 185 186 }else if(strchr(retsu,'b')){ 187 char y[MOJI]; 188 if(line-1<0) 189 { 190 printf("入替えできません\n"); 191 continue; 192 } 193 strcpy(y,str[line]); 194 strcpy(str[line],str[line+1]); 195 strcpy(str[line+1],y); 196 printf("%d:%s\n",LINE,str[line]); 197 continue; 198 199 }else if (strchr(retsu, 'v')) { 200 char fname[128]; 201 char c2[5]; 202 FILE* wfp; 203 printf("file name is [%s] ?:[y or n]: ", argv[1]); 204 205 fgets(c2, sizeof(c2), stdin); 206 207 if (strchr(c2, 'y')) { 208 strcpy(fname, argv[1]); 209 } else if (strchr(c2, 'n')) { 210 printf("Enter file name:"); 211 fgets(fname,sizeof(fname),stdin); 212 } else if(c2[0] == '\n') { 213 continue; 214 } else { 215 printf("Command Error.[%s]\n",c2); 216 continue; 217 } 218 219 if ((wfp = fopen(fname, "w")) == NULL) { 220 printf("File open Error:w\n"); 221 } 222 for (i=0; i <= line_max; i++) { 223 fprintf(wfp, "%s", str[i]); 224 } 225 fclose(wfp); 226 printf("Write Finish...\n"); 227 continue; 228 229 230 }else if(strchr(retsu,'t')){ 231 line=1; 232 printf("%d:%s\n",LINE,str[line]); 233 }else if(strchr(retsu,'l')){ 234 line=line_max; 235 printf("%d:%s\n",LINE,str[line]); 236 printf("linemax=%d\n",line_max+1); 237 238 239 }else if(strchr(retsu,'x')){ 240 printf("終了\n"); 241 break; 242 }else if(gyo<=line_max && gyo>=0){ 243 line=gyo; 244 printf("*%d:%s\n",LINE,str[line]); 245 continue; 246 }else{ 247 printf("retsu:%s\n",retsu); 248 printf("line:%d\n",line); 249 printf("コマンドが不正です\n"); 250 continue; 251 } 252 253 } 254 fclose(fp); 255 exit(EXIT_SUCCESS); 256 } 257 258 259///関数 260 261 262int kansu (char* str,FILE* fp) 263{ 264int i=254; 265int r=0; 266 267printf("str[i]==[%d]\n",(unsigned char)str[i]); 268printf("str[i]==[%c]\n",(unsigned char)str[i]); 269printf("str[i]==[0x%x]\n",(unsigned char)str[i]); 270 271 if((unsigned char)str[i]=='\n' || str[i]=='\0'){ 272 printf("改行、NULLを検知する\n"); 273 return 0; 274 } 275 276 else if((unsigned char)str[i]>=0 && (unsigned char)str[i]<=127){ 277 printf("00〜7Fに入りました\n"); 278 str[i+1]=10; 279 str[i+2]=0; 280 return 0; 281 } 282 283 284 else if((unsigned char)str[i]>=224 && (unsigned char)str[i]<=239){printf("E0〜EFに入りました\n"); 285 str[i]=10; 286 str[i+1]=0; 287 r=fseek(fp,sizeof(char)*-1,SEEK_CUR); 288 if(r){ 289 printf("seekに失敗しました\n"); 290 return -1; 291 } 292 return 0; 293 } 294 else if((unsigned char)str[i]>=128 &&(unsigned char)str[i]<=191){ 295 printf("80~8Fに入りました\n"); 296 if((unsigned char)str[i-1]>=128 &&(unsigned char)str[i-1]<=191){ 297 str[i+1]=10; 298 str[i+2]=0; 299 return 0; 300 } 301 else{ 302 str[i-1]=10; 303 str[i]=0; 304 return 0; 305 r=fseek(fp,sizeof(char)*-2,SEEK_CUR); 306 if(r){ 307 printf("seekに失敗しました\n"); 308 return -1; 309 } 310 return 0; 311 } 312 } 313 else if((unsigned char)str[i]>=224 && (unsigned char)str[i]<=239){ 314 printf("E0〜EFに入りました\n"); 315 str[i+1]=10; 316 str[i+2]=0; 317 return 0; 318 319 } 320} 321
環境はLinuxのubuntu上です。
回答3件
あなたの回答
tips
プレビュー