文字列を格納するバッファの長さ
文字列を格納するバッファの長さ
基本課題 12..2
文字列yを文字列xの最後に連結する関数stringcat(char [/url], char [/url])を作成せよ.この関数を用いて、入力された2つの文字列を連結するプ ログラムを作成せよ。
注意: stringcat()を呼び出すときは,連結後の文字列がxの 配列長を超えないように注意すること.
% ./catenate
文字列x (20字まで)? Ritsumeikan
文字列y (20字まで)? BKC
連結後のx: RitsumeikanBKC ←全部で20字以内なので連結可能
% ./catenate
文字列x (20字まで)? Ritsumeikan
文字列y (20字まで)? BiwakoKusatsuCampus
字数超過のため連結不可 ←20字を超えるので連結不可能
%
という問題で、
#include<stdio.h>
#define BUFFER_SIZE 260
void string_cat(char x[/url],char y[/url]){
int i,j,k;
for(i=0;x='\0';i++){
k++;
}
for(j=0;y[j]='\0';j++){
x[k] = y[j];
}
if(i+j<=20){
printf("連結後のx :%s",x);
}
else{
printf("字数超過のため連結不可");
}
}
int main(void){
char x[BUFFER_SIZE];
char y[BUFFER_SIZE];
printf("文字列x (20字まで)? ");
fgets(x,BUFFER_SIZE,stdin);
printf("文字列y (20字まで)? ");
fgets(y,BUFFER_SIZE,stdin);
string_cat(x, y);
}
というソースを書いてコンパイルして実行してみると、
文字列x (20字まで)? (入力)
文字列y (20字まで)? (入力)
しか表示されず、2つの文字列を連結した関数が表示されません。なぜでしょうか?
どこをなおすべきでしょうか?
文字列yを文字列xの最後に連結する関数stringcat(char [/url], char [/url])を作成せよ.この関数を用いて、入力された2つの文字列を連結するプ ログラムを作成せよ。
注意: stringcat()を呼び出すときは,連結後の文字列がxの 配列長を超えないように注意すること.
% ./catenate
文字列x (20字まで)? Ritsumeikan
文字列y (20字まで)? BKC
連結後のx: RitsumeikanBKC ←全部で20字以内なので連結可能
% ./catenate
文字列x (20字まで)? Ritsumeikan
文字列y (20字まで)? BiwakoKusatsuCampus
字数超過のため連結不可 ←20字を超えるので連結不可能
%
という問題で、
#include<stdio.h>
#define BUFFER_SIZE 260
void string_cat(char x[/url],char y[/url]){
int i,j,k;
for(i=0;x='\0';i++){
k++;
}
for(j=0;y[j]='\0';j++){
x[k] = y[j];
}
if(i+j<=20){
printf("連結後のx :%s",x);
}
else{
printf("字数超過のため連結不可");
}
}
int main(void){
char x[BUFFER_SIZE];
char y[BUFFER_SIZE];
printf("文字列x (20字まで)? ");
fgets(x,BUFFER_SIZE,stdin);
printf("文字列y (20字まで)? ");
fgets(y,BUFFER_SIZE,stdin);
string_cat(x, y);
}
というソースを書いてコンパイルして実行してみると、
文字列x (20字まで)? (入力)
文字列y (20字まで)? (入力)
しか表示されず、2つの文字列を連結した関数が表示されません。なぜでしょうか?
どこをなおすべきでしょうか?
Re:文字列を格納するバッファの長さ
>しか表示されず、2つの文字列を連結した関数が表示されません。なぜでしょうか?
2つの文字列を連結した関数が表示されないというのが今一つ意味不明ですが、
関数 string_cat() はちゃんと呼び出されています。
for(i=0;x='\0';i++)
の文ですが、x に '\0' を代入しているためループ条件が真になることはありません。
for(j=0;y[j]='\0';j++)
の文も同じですね。
それより、ソースを書く場合は
2つの文字列を連結した関数が表示されないというのが今一つ意味不明ですが、
関数 string_cat() はちゃんと呼び出されています。
for(i=0;x='\0';i++)
の文ですが、x に '\0' を代入しているためループ条件が真になることはありません。
for(j=0;y[j]='\0';j++)
の文も同じですね。
それより、ソースを書く場合は
タグで囲むようにしてください。 追記です。 この手のバグは1行1行処理を追っていけばすぐに分かります。 ソースレベルデバッガの導入を強く強くお勧めします。
Re:文字列を格納するバッファの長さ
for(i=0;x='\0';i++){
k++;
}
for(j=0;y[j]='\0';j++){
x[k] = y[j];
}
これって…x[k]にいっぱい代入されてる気がします…
[k+j-1]とかに変えてみたほうがいいと思います…
k++;
}
for(j=0;y[j]='\0';j++){
x[k] = y[j];
}
これって…x[k]にいっぱい代入されてる気がします…
[k+j-1]とかに変えてみたほうがいいと思います…
Re:文字列を格納するバッファの長さ
このコードをコンパイルすると
> for(i=0;x='\0';i++){
> for(j=0;y[j]='\0';j++){
この行に問題があると表示されたはずですが…
メッセージ読みました?
> for(i=0;x='\0';i++){
> for(j=0;y[j]='\0';j++){
この行に問題があると表示されたはずですが…
メッセージ読みました?
Re:文字列を格納するバッファの長さ
すいません。利用規約読んでなかったです。
次からはオリジナルな名前にします。それから、似たような質問を2回もしてすいません。
for(i=0;x!='\0';i++){
for(j=0;y[j]!='\0';j++){
に直すとコンパイルはとおりました。
しかし、セグメントエラーがでます。デバッガで調べたいのですが、デバッガがインストールされておらず、調べられません。ちなみに、仮想でネットにつながらないVMwareを使っています。
どうすればインストールできるでしょうか?
次からはオリジナルな名前にします。それから、似たような質問を2回もしてすいません。
for(i=0;x!='\0';i++){
for(j=0;y[j]!='\0';j++){
に直すとコンパイルはとおりました。
しかし、セグメントエラーがでます。デバッガで調べたいのですが、デバッガがインストールされておらず、調べられません。ちなみに、仮想でネットにつながらないVMwareを使っています。
どうすればインストールできるでしょうか?
Re:文字列を格納するバッファの長さ
パコネコさんが言うとおりx[k+j-1]にして、初級者さんのいうとおりにk=0で初期化するとコンパイルは通るのですが、実行すると2つの文字列を連結した関数が表示されず、セグメンテーションエラーがでます。
これ以上どこを直せばよいのでしょうか?
これ以上どこを直せばよいのでしょうか?
Re:文字列を格納するバッファの長さ
今のコードはどうなっているのですか?
どこが変更されたのか、わからないのですが…
皆様がおっしゃっている他にどこが間違ってるのかわからないのですが…
エラーのメッセージはありますか?
どこが変更されたのか、わからないのですが…
皆様がおっしゃっている他にどこが間違ってるのかわからないのですが…
エラーのメッセージはありますか?
Re:文字列を格納するバッファの長さ
#include<stdio.h>
#define BUFFER_SIZE 260
void string_cat(char x[/url],char y[/url]){
int i,j,k;
k=0; ←ーーーーーーーーーーーーーーーーーーーー変更
for(i=0;x!='\0';i++){←ーーーーーーーーーーーーー|
k++; |
} |
for(j=0;y[j]!='\0';j++){ ←ーーーーーーーーーーーーー
x[k+j-1] = y[j]; ←ーーー
k++;
}
if(i+j<=20){
printf("連結後のx :%s",x);
}
else{
printf("字数超過のため連結不可");
}
}
int main(void){
char x[BUFFER_SIZE];
char y[BUFFER_SIZE];
printf("文字列x (20字まで)? ");
fgets(x,BUFFER_SIZE,stdin);
printf("文字列y (20字まで)? ");
fgets(y,BUFFER_SIZE,stdin);
string_cat(x, y);
}
そして、実行すると
文字列x (20字まで)? (入力)
文字列y (20字まで)? (入力)
セグメンテーションエラーになります
#define BUFFER_SIZE 260
void string_cat(char x[/url],char y[/url]){
int i,j,k;
k=0; ←ーーーーーーーーーーーーーーーーーーーー変更
for(i=0;x!='\0';i++){←ーーーーーーーーーーーーー|
k++; |
} |
for(j=0;y[j]!='\0';j++){ ←ーーーーーーーーーーーーー
x[k+j-1] = y[j]; ←ーーー
k++;
}
if(i+j<=20){
printf("連結後のx :%s",x);
}
else{
printf("字数超過のため連結不可");
}
}
int main(void){
char x[BUFFER_SIZE];
char y[BUFFER_SIZE];
printf("文字列x (20字まで)? ");
fgets(x,BUFFER_SIZE,stdin);
printf("文字列y (20字まで)? ");
fgets(y,BUFFER_SIZE,stdin);
string_cat(x, y);
}
そして、実行すると
文字列x (20字まで)? (入力)
文字列y (20字まで)? (入力)
セグメンテーションエラーになります
Re:文字列を格納するバッファの長さ
エラーについては私では見つけれないかも…
起動した結果、矢印と大文字空欄とk++以外に間違いは見つけれませんでした。
起動できましたし…(エラーの出るような)ソース上のミスは見つけれませんでした。
すいません。
起動した結果、矢印と大文字空欄とk++以外に間違いは見つけれませんでした。
起動できましたし…(エラーの出るような)ソース上のミスは見つけれませんでした。
すいません。
Re:文字列を格納するバッファの長さ
> for(j=0;y[j]!='\0';j++){ ←ーーーーーーーーーーーーー
> x[k+j-1] = y[j]; ←ーーー
> k++;
ここなんですがなぜkを増やすようにしたのですか。
> x[k+j-1] = y[j]; ←ーーー
> k++;
ここなんですがなぜkを増やすようにしたのですか。
Re:文字列を格納するバッファの長さ
セグメンテーションエラーについて調べてみたところ(さっきからわからなかった…)
「領域破壊」もしくはそれと勘違いした時に出るとのことなので、
string_cat(x, y);
これのx,yを受け止めきれてないかもしれません…(char x[/url],char y[/url])こっちが…
というか(関係ないかもですが)
#define BUFFER_SIZE 260
これってこんなに大きい必要あるのでしょうか?
getsならともかくfgetsならここまででかくする必要があるのでしょうか?
「領域破壊」もしくはそれと勘違いした時に出るとのことなので、
string_cat(x, y);
これのx,yを受け止めきれてないかもしれません…(char x[/url],char y[/url])こっちが…
というか(関係ないかもですが)
#define BUFFER_SIZE 260
これってこんなに大きい必要あるのでしょうか?
getsならともかくfgetsならここまででかくする必要があるのでしょうか?
Re:文字列を格納するバッファの長さ
fgetsだとどうやら改行文字も取得してしまうようですね
なので入力は
scanf("%s",x);
scanf("%s",y);
に変更し
void string_cat(char x[/url],char y[/url]){
int i,j,k;
k=0;
for(i=0;x!='\0';i++){
k++;
}
for(j=0;y[j]!='\0';j++){
x[k+j] = y[j];
}
x[k+j] = '\0';
if(i+j<=20){
printf("連結後のx :%s",x);
}
else{
printf("字数超過のため連結不可");
}
}
となおすと正しく出ます
また、文字列連結後に調べて配列外にアクセスしていました、という事後報告は
良くないので、
あらかじめサイズを確認してから、連結、の流れが望ましいと思われます
なので入力は
scanf("%s",x);
scanf("%s",y);
に変更し
void string_cat(char x[/url],char y[/url]){
int i,j,k;
k=0;
for(i=0;x!='\0';i++){
k++;
}
for(j=0;y[j]!='\0';j++){
x[k+j] = y[j];
}
x[k+j] = '\0';
if(i+j<=20){
printf("連結後のx :%s",x);
}
else{
printf("字数超過のため連結不可");
}
}
となおすと正しく出ます
また、文字列連結後に調べて配列外にアクセスしていました、という事後報告は
良くないので、
あらかじめサイズを確認してから、連結、の流れが望ましいと思われます