文字列定数をコピーするために書いたプログラムを次に示します。
プログラムを実行するとクラッシュします。なんでこんなことが起こっているの ?
#include <stdio.h>
char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char c;
char *l;
main(){
while((c = *alpha++)!='\0')
*l++ = *alpha;
printf("%s\n",l);
}
Cで文字列をコピーするには、strcpyを使用できます。以下に例を示します。
#include <stdio.h>
#include <string.h>
const char * my_str = "Content";
char * my_copy;
my_copy = malloc(sizeof(char) * (strlen(my_str) + 1));
strcpy(my_copy,my_str);
偶発的なバッファオーバーフローを回避する場合は、strncpy
の代わりにstrcpy
を使用します。例えば:
const char * my_str = "Content";
const size_t len_my_str = strlen(my_str) + 1;
char * my_copy = malloc(len_my_str);
strncpy(my_copy, my_str, len_my_str);
そのような手動コピーを実行するには:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* orig_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char* ptr = orig_str;
// Memory layout for orig_str:
// ------------------------------------------------------------------------
// |0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26| --> indices
// ------------------------------------------------------------------------
// |A|B|C|D|E|F|G|H|I|J|K |L |M |N |O |P |Q |R |S |T |U |V |W |X |Y |Z |\0| --> data
// ------------------------------------------------------------------------
int orig_str_size = 0;
char* bkup_copy = NULL;
// Count the number of characters in the original string
while (*ptr++ != '\0')
orig_str_size++;
printf("Size of the original string: %d\n", orig_str_size);
/* Dynamically allocate space for the backup copy */
// Why orig_str_size plus 1? We add +1 to account for the mandatory
// '\0' at the end of the string.
bkup_copy = (char*) malloc((orig_str_size+1) * sizeof(char));
// Place the '\0' character at the end of the backup string.
bkup_copy[orig_str_size] = '\0';
// Current memory layout for bkup_copy:
// ------------------------------------------------------------------------
// |0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26| --> indices
// ------------------------------------------------------------------------
// | | | | | | | | | | | | | | | | | | | | | | | | | | |\0| --> data
// ------------------------------------------------------------------------
/* Finally, copy the characters from one string to the other */
// Remember to reset the helper pointer so it points to the beginning
// of the original string!
ptr = &orig_str[0];
int idx = 0;
while (*ptr != '\0')
bkup_copy[idx++] = *ptr++;
printf("Original String: %s\n", orig_str);
printf("Backup String: %s\n", bkup_copy);
return 0;
}
l
にスペースを割り当てる必要があります。現在、メモリ内のランダムなスポットを指しているため、そのスポットに書き込もうとすると、オペレーティングシステムがアプリケーションをシャットダウン(クラッシュ)する可能性があります。コードをそのまま使用したい場合は、l
にmalloc()
でスペースを割り当てるか、"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
とNULLターミネータを保持するのに十分なスペースを持つ文字配列としてl
を作成します。
ポインターの入門書については、 http://cslibrary.stanford.edu/106/ を参照してください。
文字列「定数/リテラル/ポインター」をコピー
_char *str = "some string thats not malloc'd";
char *tmp = NULL;
int i = 0;
for (i = 0; i < 6; i++) {
tmp = &str[i];
}
printf("%s\n", tmp);
_
反転
_char *str = "some stupid string";
char *tmp, *ptr = NULL;
ptr = str;
while (*str) { ++str; }
int len = str - ptr;
int i = 0;
for (i = len; i > 11; i--) {
tmp = &ptr[i];
}
printf("%s\n", tmp);
_
_tmp = &blah[i]
_はtmp = &(*(blah + i))
と交換できます。
以下のコードを直接実行できます。
char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *l = alpha;
コードが以下の場合:
const char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char *l = alpha;
:)
cpy関数は2つのcharポインターを取り、srcポインターはmain関数で定義されたsrc(char配列)の初期文字を指し、desポインターが同じで定義されたdes(char配列)の初期位置を指しますメイン関数とsrcポインターのwhileループ値は、desポインターに値を割り当て、次の要素へのポインターをインクリメントします。これは、whileループがnullに遭遇し、ループから出てdesポインターが単純にnullを割り当てるまで発生しますすべての値を取得します。
#include<stdio.h>
void cpy(char *src,char *des)
{
while(*(des++) = *(src++));
*des = '\0';
}
int main()
{
char src[100];
char des[100];
gets(src);
cpy(src,des);
printf("%s",des);
}
出力: 画像
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 256
int main(void) {
char *original, *copy, *start; //three character pointers
original = malloc(sizeof(char) * MAX_LENGTH); //assigning memory for strings is good practice
gets(original); //get original string from input
copy = malloc(sizeof(char) * (strlen(original)+1)); //+1 for \0
start = copy;
while((*original)!='\0')
*copy++ = *original++;
*copy = '\0';
copy = start;
printf("The copy of input string is \"%s\".",copy);
return 0;
}