前提・実現したいこと
https://atcoder.jp/contests/abs/tasks/arc065_a
atcoder begginnersselection第九問、白昼夢です。
問題文
英小文字からなる文字列 S が与えられます。 Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。
T の末尾に dream dreamer erase eraser のいずれかを追加する。
制約
1≦∣S∣≦10^5
S は英小文字からなる。
入力
入力は以下の形式で標準入力から与えられる。
S
出力
S=T とすることができる場合 YES を、そうでない場合 NO を出力せよ。
入力例 1
erasedream
出力例 1
YES
erase dream の順で T の末尾に追加することで S=T とすることができます。
入力例 2
dreameraser
出力例 2
YES
dream eraser の順で T の末尾に追加することで S=T とすることができます。
入力例 3
dreamerer
出力例 3
NO
発生している問題・エラーメッセージ
oamke@DESKTOP-3PLG0UV ~/kyopuro/begineersselection $ gcc hakutyumu.c hakutyumu.c: In function 'main': hakutyumu.c:16:64: warning: passing argument 1 of 'strcat' from incompatible poi nter type [-Wincompatible-pointer-types] 16 | if(strncmp(s1, dreameraser, 10)==0){*s1=*s1+10; strcat(t, "dream eraser"); printf("%s", t);} | ^ | | | char ** In file included from hakutyumu.c:2: c:\mingw\include\string.h:75:40: note: expected 'char *' but argument is of type 'char **' 75 | _CRTIMP __cdecl __MINGW_NOTHROW char *strcat (char *, const char *); | ^~~~~~ hakutyumu.c:17:63: warning: passing argument 1 of 'strcat' from incompatible poi nter type [-Wincompatible-pointer-types] 17 | else if(strncmp(s1, dreamer, 7)==0){*s1=*s1+7; strcat(t, "dreame r");printf("%s", t);} | ^ | | | char ** In file included from hakutyumu.c:2: c:\mingw\include\string.h:75:40: note: expected 'char *' but argument is of type 'char **' 75 | _CRTIMP __cdecl __MINGW_NOTHROW char *strcat (char *, const char *); | ^~~~~~ hakutyumu.c:18:61: warning: passing argument 1 of 'strcat' from incompatible poi nter type [-Wincompatible-pointer-types] 18 | else if(strncmp(s1, dream, 5)==0){*s1=*s1+5; strcat(t, "dream"); printf("%s", t);} | ^ | | | char ** In file included from hakutyumu.c:2: c:\mingw\include\string.h:75:40: note: expected 'char *' but argument is of type 'char **' 75 | _CRTIMP __cdecl __MINGW_NOTHROW char *strcat (char *, const char *); | ^~~~~~ hakutyumu.c:19:62: warning: passing argument 1 of 'strcat' from incompatible poi nter type [-Wincompatible-pointer-types] 19 | else if(strncmp(s1, eraser, 6)==0){*s1=*s1+6; strcat(t, "eraser" );printf("%s", t);} | ^ | | | char ** In file included from hakutyumu.c:2: c:\mingw\include\string.h:75:40: note: expected 'char *' but argument is of type 'char **' 75 | _CRTIMP __cdecl __MINGW_NOTHROW char *strcat (char *, const char *); |
###実行結果
$ ./a.exe dreameraser nreameraserdreamerasernreameraserdreameraserNO
該当のソースコード
#include <stdio.h> #include <string.h> int main(){ char s[100000]; char *dream="dream"; char *dreamer="dreamer"; char *erase="erase"; char *eraser="eraser"; char *dreameraser="dreameraser"; char *s1; scanf("%s", &s); s1=s; char *t[] = {}; while(1){ if(strncmp(s1, dreameraser, 10)==0){*s1=*s1+10; strcat(t, "dreameraser"); printf("%s", t);} else if(strncmp(s1, dreamer, 7)==0){*s1=*s1+7; strcat(t, "dreamer");printf("%s", t);} else if(strncmp(s1, dream, 5)==0){*s1=*s1+5; strcat(t, "dream");printf("%s", t);} else if(strncmp(s1, eraser, 6)==0){*s1=*s1+6; strcat(t, "eraser");printf("%s", t);} else if(*s1=='\0'){printf("%s", t);printf("YES");break;} else{printf("%s", t);printf("NO");break;} } return 0; }
試したこと
上のコードの方針としては、文字列を比べて等しければ文字列tにその文字列を追加して、その文字数分ポインタに値を足して、繰り返しによって調べ続けるというものです。
文字列tがどうなっているか見るためにprintfで表示させました。
実行結果を見るとなぜか最初の文字がnになっています。なぜでしょうか。また、三回dreameraserと表示された後NOとなっているのがなぜかわかりません。ポインタの使い方が間違っているのでしょうか。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー