"Bangkok" --> "b:*,a:*,n:*,g:*,k:**,o:*" "Las Vegas" --> "l:*,a:**,s:**,v:*,e:*,g:*"
上記の例は、文字列を受け取り、それぞれの文字の出現数を*の数で表しています。このような文字列を戻り値として返す関数を作成する問題をcodewars(https://www.codewars.com/kata/5b358a1e228d316283001892/train/c)というサイト内で解いています。
自分で作成した関数をテストしてみると
("Chicago") の場合は、
"c:**,h:,i:,a:,g:,o:",となるべきところが "C:h:i:c:a:g:o:"のようになってしまいます。
コードを示しますので、どこがおかしいのか教えていただけますか。また、コード内でstring++ = と何度か書いてあるのですが、いまいちこの*(変数名)++の意味が分かっていないので、こちらのほうも教えていただきたいです。特に、一番最初の*string++はstring[0]と同じことなのでしょうか?
c
1#include <string.h> 2#include <stdlib.h> //malloc 3 4char* get_strings(const char *city) 5{ 6 int i, j, n; 7 n = strlen(city); 8 char *string; 9 string = malloc( n * 4 + 1); 10 char *base = string; 11 12 for(i = 0; i < n; i++ ) 13 { 14 15 int count = 0; 16 int count2 = 0; 17 18 for(j = 0; j < n; j++) 19 { 20 if(city[i] == city[j])count++; 21 22 } 23 24 *string++ = city[i]; 25 *string++ = ':'; 26 27 if(i > 0) 28 { 29 for(int b = i - 1; b == 0; b--) 30 { 31 if(city[i] == city[b])count2++; 32 } 33 } 34 35 36 if(count2 != 0) 37 { 38 39 40 for(int a = 1; a == count; a++) 41 { 42 *string++ ='*'; 43 } 44 45 if(i != (n -1)) 46 { 47 *string++ = ','; 48 } 49 else if(i == (n - 1)) 50 { 51 *string++ = '\0'; 52 } 53 54 55 56 57 } 58 59 60 61 62 } 63 64 return base; 65}
回答いただいたものを参考にして、少し修正してみました。
c
1#include <string.h> 2#include <stdlib.h> //malloc 3#include <ctype.h> // tolower 4 5char* get_strings(const char *city) 6{ 7 int i, j, n; 8 n = strlen(city); 9 char *string; 10 string = malloc( n * 4 + 1); 11 char *base = string; 12 13 for(i = 0; i < n; i++ ) 14 { 15 int c = tolower((unsigned char)city[i]); 16 if (!isalpha(c)) continue; 17 18 int count = 0; 19 int count2 = 0; 20 21 for(j = 0; j < n; j++) 22 { 23 if(tolower(city[i]) == tolower(city[j]))count++; 24 25 } 26 27 28 if(i > 0) 29 { 30 for(int b = i - 1; b >= 0; b--) 31 { 32 if(tolower(city[i]) == tolower(city[b]))count2++; 33 } 34 } 35 if(count2 != 0)continue; 36 37 *string++ = tolower(city[i]); 38 *string++ = ':'; 39 40 41 for(int a = 1; a <= count; a++) 42 { 43 *string++ ='*'; 44 } 45 46 if(i != (n -1)) //この部分が問題? 47 { 48 *string++ = ','; 49 } 50 else 51 { 52 *string = '\0'; 53 } 54 55 56 } 57 58 return base; 59}
文字列によって成功するようになりましたが、まだ問題があるようです。
メッセージは
string_literal("Bangkok") should return "b:*,a:*,n:*,g:*,k:**,o:*", actual: "b:*,a:*,n:*,g:*,k:**,o:*,\"" string_literal("Dhaka") should return "d:*,h:*,a:**,k:*", actual: "d:*,h:*,a:**,k:*,"
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。