前提・実現したいこと
C言語を用いて、英文字列に各文字間にスペースを挿入する関数「char *strspace(const char *s)」を含むプログラムを書きたいと思っています。
#include <stdio.h> char *strspace(const char *s) { ????? } int main(void) { char a[9999]; printf("英文字列を入力してください。\n"); scanf("%s",a); printf("%s\n",strspace(a)); return 0; }
例)abcdefg → a b c d e f g
発生している問題・エラーメッセージ
「const」でポインタsの要素を触ることは禁止されている状態で、関数「char *strspace(const char *s)」をどのように書けばよいのか思いつきません。
どのように考えればよいかご教授ください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
「const」でポインタsの要素を触ることは禁止されている状態で
s
の指す先の文字を変更できないと思ったのであれば、間違いです。
s
というポインタ変数に代入できないだけです。
まあ、どっちみち、長さが足りないので、s
の指す領域は更新してもしょうがないですが。
引数の文字列長strlen(s)
を2倍した値が、結果格納用領域の必要最低限な長さなので、malloc(strlen(s)*2)
した領域を使って、そこに、結果文字列を格納してください。
malloc
の使い方は分かりますか?
投稿2018/11/01 11:31
編集2018/11/02 03:52総合スコア84533
0
スペースを入れた結果を格納するバッファのアドレスとそのサイズを引数に取る必要がありますね
元の文字列はいじりません
投稿2018/11/01 11:09
総合スコア87774
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/01 12:23
2018/11/01 12:28
2018/11/01 12:32
0
ベストアンサー
修正しておきました。
for(i=0;i<strlen(s);i++) ですが、sを変化させているので
strlen(s)の値が、毎回変わってしまいます。
1)これを固定させます。
2)終端は、'\0'を入れないとだめです。(文字列操作の鉄則です)
3)ついでですが、if (2*strlen(s) > sizeof(buff)) return NULL;でreturnしているので
elseにする必要はありません。
for(・・・)から書いても構いません。そのほうがすっきりします。
ここは、動作上は問題ないので、あえて修正しませんでしたが・・・・
C
1#include <stdio.h> 2#include <string.h> 3 4char *strspace(const char *s) 5{ 6 static char buff[9999*2]; 7 int i,len; 8 if (2*strlen(s) > sizeof(buff)) return NULL; 9 else 10 { 11 len = strlen(s); 12 for(i=0;i<len;i++) 13 { 14 buff[2*i]=*s++; 15 buff[2*i+1]=' '; 16 } 17 buff[2*i-1] = '\0'; 18 return buff; 19 } 20} 21 22int main(void) 23{ 24 char a[9999]; 25 printf("英文字列を入力してください。\n"); 26 scanf("%s",a); 27 printf("%s\n",strspace(a)); 28 return 0; 29} 30 31
投稿2018/11/02 05:22
編集2018/11/02 05:27総合スコア5438
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/02 05:31 編集
2018/11/02 06:04 編集
2018/11/02 07:22
2018/11/02 07:24
2018/11/02 07:35
2018/11/02 07:41 編集
2018/11/02 07:38
2018/11/02 07:38
2018/11/02 07:46
0
内部に十分大きなバッファを確保し、そこへ格納します。
そのバッファに格納できない場合は、NULLを返します。
C
1#include <stdio.h> 2#include <string.h> 3 4char *strspace(const char *s) 5{ 6 static char buff[9999*2]; 7 if (2*strlen(s) > sizeof(buff)) return NULL; 8 //以降 sに空白を付加しながらbuffに文字を格納 9 return buff; 10} 11 12int main(void) 13{ 14 char a[9999]; 15 printf("英文字列を入力してください。\n"); 16 scanf("%s",a); 17 printf("%s\n",strspace(a)); 18 return 0; 19} 20
投稿2018/11/01 11:36
編集2018/11/01 11:38総合スコア5438
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/01 12:27
2018/11/02 05:07
0
strspace 関数中で static な配列を用意した場合、マルチスレッドで問題がでる気がします。
static な配列を使わない、 strspec の引数に結果を格納するエリアとサイズを渡すようにしたものを書いてみました。
扱える文字の長さを 3 にして、境界での動作を試すことを mai() 中で行っています。
a.c
c
1#include <stdio.h> 2#include <string.h> 3 4#define SRC_BUFF_SIZE (4) // (9999) 5 6const char *strspace(const char *src, char * dest, size_t dest_size) { 7 char w[BUFSIZ]; 8 char *wp = w; 9 for (; *src; ) { 10 *wp++ = *src++; 11 *wp++ = ' '; 12 } 13 // 最後の ' ' は削除する 14 if (w < wp) {wp--;} 15 *wp = '\0'; 16 17 strncpy(dest, w, dest_size); 18 dest[dest_size - 1] = '\0'; // strncpy で '\0' が設定されなかった場合への対処 19 return dest; 20} 21 22int main(void) { 23 char a[SRC_BUFF_SIZE]; 24 char b[SRC_BUFF_SIZE * 2 - 1]; 25 26 strcpy(a, ""); 27 printf("'%s' -> '%s'\n", a, strspace(a, b, sizeof(b))); 28 strcpy(a, "1"); 29 printf("'%s' -> '%s'\n", a, strspace(a, b, sizeof(b))); 30 strcpy(a, "12"); 31 printf("'%s' -> '%s'\n", a, strspace(a, b, sizeof(b))); 32 strcpy(a, "123"); 33 printf("'%s' -> '%s'\n", a, strspace(a, b, sizeof(b))); 34 printf("'%s' -> '%s'\n", a, strspace(a, b, sizeof(b) - 1)); 35 printf("'%s' -> '%s'\n", a, strspace(a, b, sizeof(b) - 2)); 36 37 printf("英文字列を入力してください。(%lu 文字以降は無視されます)\n", sizeof(a) - 1); 38 fgets(a, sizeof(a) - 1, stdin); 39 printf("'%s' -> '%s'\n", a, strspace(a, b, sizeof(b))); 40 return 0; 41}
投稿2018/11/02 15:09
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/01 12:23
2018/11/01 12:53
2018/11/01 13:49
2018/11/01 14:18
2018/11/02 02:56
2018/11/02 03:53 編集
2018/11/02 07:07