質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3527閲覧

文字列のコピーについて

h_proc

総合スコア68

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/01/21 13:21

文字列sorceを文字列strにコピーし、入力された文字数をカウントする関数を作っています。たとえば、文字列sorceにhello!と入力したところ、コピー先の文字列にはフフフフフフフフフフフフフフフフhello!と表示されてしまいました。以前にも同じ内容の質問があったのですが、どうしても分からなかったたまえ、質問させていただきました。また、ビルトしたときに、scanfのところにエラーが表示されました。どこが間違っているかも合わせて教えていただけたら幸いです。よろしくお願いい致します。

#include <stdio.h> #define ARRAY_SIZE 50 int str_copy(char str[], char sorce[]); int count = 0; int str_copy(char str[], char sorce[]) { //sorceがコピー元、strがコピー先 char temp; temp = sorce[ARRAY_SIZE]; str[ARRAY_SIZE] = temp; for (int i = 0; sorce[i] != '\0'; i++) { count = i; } return count; } int main(void) { printf("Put sentences.\n"); char sorce[ARRAY_SIZE]; scanf("%s", &sorce); char str[ARRAY_SIZE - 1]; str_copy(str,sorce); printf("%s\0",str); printf(", length %d \n", count); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/01/21 13:30

プログラム中に、コピーしている部分がありませんが、コピペミスでしょうか?
h_proc

2019/02/12 05:07

#include <stdio.h> #define ARRAY_SIZE 50 int str_copy(char str[], char sorce[]); int count = 0; int str_copy(char str[], char sorce[]) { //sorceがコピー元、strがコピー先 for (int i = 0; sorce[i] != '\0'; i++) { str[i] = sorce[i]; } printf("これはもとの\n"); printf("%s\n", sorce); printf("これはコピー先\n"); printf("%s\n", str); for (int i = 0; str[i] != '\0'; i++) { count += 1; } return count; } int main(void) { printf("Input sentences.\n"); char sorce[ARRAY_SIZE]; scanf("%s", sorce); char str[ARRAY_SIZE]; str_copy(str,sorce); printf("%s",str); printf(", length %d \n", count); return 0; } 修正しました。よろしくお願いい致します。
guest

回答2

0

scanf("%s", &sorce);

%s の場合、引数は、文字列です。 &sorceは、文字列のアドレスです。 多分、多くの処理系は、そのまま、sorceと見なす(らしい)ので、動きそうですが。

temp = sorce[ARRAY_SIZE]; str[ARRAY_SIZE] = temp;

tempに sorce[ARRAY_SIZE] の文字(一文字)を入れています。しかし、sorceのサイズは、ARRAY_SIZEなので範囲外となっています。 (C では、sorceの配列は、0~(ARRAY_SIZE -1) までの配列)

C言語での文字列の扱いを再確認される事を勧めます。

[追記]
temp = sorce[ARRAY_SIZE]; sorce配列の ARRAY_SIZE + 1 番目(範囲外)の文字を temp に代入。
str[ARRAY_SIZE] = temp; str配列の ARRAY_SIZE + 1 番目(範囲外)に tempの文字を代入。
printf("%s\0",str); コピーは失敗しているが、str, sorce の順にメモリが確保(推測)されているため、"hello!" の文字列が出力されていると思われる。

投稿2019/01/21 13:36

編集2019/01/21 15:09
pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2019/01/22 12:33

ありがとうございます。scanfのところですが、sorce[ARRAY_SIZE]と書き直せば、文字列として認識されるのでしょうか。文字列についてもう一度確認します。
guest

0

ベストアンサー

temp = sorce[ARRAY_SIZE];

str[ARRAY_SIZE] = temp;

これ、意味不明です
よく考えてみましょう

char sorce[ARRAY_SIZE];

scanf("%s", &sorce);

これも間違ってます

投稿2019/01/21 13:29

編集2019/01/21 13:30
y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2019/01/22 12:35

ありがとうございます。 for (int i = 0; i < ARRAY_SIZE - 1; i++) { sorce[i] = str[i]; } のように書き直しました。これで正しくコピーされますか。 文字列に対する理解が不十分であったため、もう一度確認して、考え直してみます。
y_waiwai

2019/01/22 14:10

それでいけるでしょう。 ただし、forの条件分は i<ARRAY_SIZE です って、文字列のコピーなら strcpy(sorce,str); で。
h_proc

2019/02/12 05:09

やはりフフフ、、、と表示されてしまいます。このように書き直したのですが、どこが間違っているのでしょうか。また、strcpは使わないで書いています。よろしくお願いい致します。 #include <stdio.h> #define ARRAY_SIZE 50 int str_copy(char str[], char sorce[]); int count = 0; int str_copy(char str[], char sorce[]) { //sorceがコピー元、strがコピー先 for (int i = 0; sorce[i] != '\0'; i++) { str[i] = sorce[i]; } printf("これはもとの\n"); printf("%s\n", sorce); printf("これはコピー先\n"); printf("%s\n", str); for (int i = 0; str[i] != '\0'; i++) { count += 1; } return count; } int main(void) { printf("Input sentences.\n"); char sorce[ARRAY_SIZE]; scanf("%s", sorce); char str[ARRAY_SIZE]; str_copy(str,sorce); printf("%s",str); printf(", length %d \n", count); return 0; }
y_waiwai

2019/02/12 05:17

現状の条件では、スペースのときはループを抜ける、というものですが、これだけではだめです。 文字列の終わりの時、も条件に含める必要があります
h_proc

2019/02/12 06:41

ループの条件に if (sorce[i] == '\0') { str[i] = '\0'; } else { //NR } を含めたのですが、結果が変わりませんでした。何度も申し訳ありません。終了条件はどのように書くべきなのでしょうか。
y_waiwai

2019/02/12 06:48 編集

あ、先のコメントは別の質問と間違えました コピー先に文字列の終端が入ってませんね int i; for ( i = 0; sorce[i] != '\0'; i++) { str[i] = sorce[i]; } str[i]='\0'; // これを付け加える としてみよう
h_proc

2019/02/12 08:50

ありがとうございます。フフフの表示が消えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問