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

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

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

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

Q&A

解決済

4回答

3218閲覧

strcpyについて

ikuo-biyori

総合スコア56

C

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

0グッド

0クリップ

投稿2016/11/01 23:34

いつもお世話になっています。C言語初心者です。strcpyの関数のコピー範囲
(例 a[2]からa[4]というようにすべての要素をコピーしない)は指定できるのでしょうか?できればやり方を教えてください。

C言語

1コード 2```#include <stdio.h> 3#include <string.h> /* 文字列操作関数用ヘッダファイル */ 4#include<stdlib.h> 5#define MAX 1024 6int main() 7{ 8 char buf[MAX]="[Wakamatsu]"; 9 char str[MAX]; 10 char rbuf[MAX]; 11 char mou[MAX]="["; 12 // char hako[MAX]; 13 14 int n,i,len,j; 15 printf("%s\n",buf); 16 while(scanf("%d %s",&n,str)!=EOF){ 17 18 len=strlen(str); 19 // printf("%d\n",len); 20 for(i=0;i<len;i++){ 21 mou[i+1]=str[i]; 22 mou[0]='['; 23 } 24 mou[len+1]=']'; 25 strcpy(rbuf,mou); 26ここのstrcpyのコピー範囲は指定できるか? 27(例 mouのmou[2]からmou[5]と言うように) 28 // printf("%s\n",rbuf); 29 for(i=0;buf[i]!='\0';i++){ 30 rbuf[i+len+2] = buf[i]; 31 } 32 33 printf(" %s\n",rbuf); 34 } 35 // printf("buf %s\n",rbuf); 36 return 0; 37}

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

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

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

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

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

guest

回答4

0

ベストアンサー

コードの詳細は確認していませんので、一般的な話です。

strcpyは、コピー元のアドレスからNULL文字までの領域を、コピー先のアドレスにコピーする機能です。
そして末尾にはNULL文字が付加されます。
似たような関数でstrncpyというのがありますが、こちらはコピーする文字数を指定できます。
但しこちらも末尾にNULL文字が付加されるので、質問の要件は満たせません。
質問のように単に要素[2]を要素[5]にコピーしたいのであれば、以下で良いです。

c

1a[4] = a[2];

strcpyのように標準関数で行いたいのであれば、NULL文字が付加されないmemcpyを使用しましょう。

c

1memcpy(&a[4], &a[2], 1);

但し1バイトではあまり意味をなさないので、2バイト以上のコピーのときに使った方がいいでしょうね。

投稿2016/11/01 23:56

ttyp03

総合スコア16998

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

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

0

ソース読みましたが mou の一部を rbuf にコピーしたいということでいいんでしょうか。
それなら普通に考えると strncpy 関数が使えます。
例として mou[2] から mou[5] までの 4 文字をコピーするならこんな感じ。

lang

1strncpy(rbuf, mou + 2, 4);

注意としては、コピー先には原則として終端文字'\0'は付かないことと、大抵の環境でstrcpy/strncpy系は非推奨(コンパイルが通らない場合もある)なので環境の推奨する文字列関数を使用すること、でしょうか。

参考

投稿2016/11/02 06:32

編集2016/11/02 06:43
KmyDev

総合スコア12

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

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

0

strcpyでは有りませんが、strncpyを使って行えます。2ステップですが

c

1mou[5]='\0';      //文字列の終端の文字0を入れる 2strncpy(rbuf,mou,2);  //3文字以降の0の前までの文字列をコピー

上記の場合は、3文字目から5文字目となります。

投稿2016/11/01 23:58

編集2016/11/02 00:17
A.Ichi

総合スコア4070

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

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

0

表示がすごいことになってますがw
strcpyではなくstrncpyではまずいでしょうか?
http://bituse.info/c_func/14

投稿2016/11/01 23:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問