"Nmy stringP"
のようなC文字列があります。NとPは任意の文字にできます。 Cで"my string"
に編集するにはどうすればよいですか?
1番目の文字ポイントを2番目の文字に「削除」するには:
char mystr[] = "Nmy stringP";
char *p = mystr;
p++; /* 'N' is not in `p` */
最後の文字を削除するには、「\ 0」に置き換えます
p[strlen(p)-1] = 0; /* 'P' is not in `p` (and it isn't in `mystr` either) */
もう1つのオプションは、「編集」がその場で修正したいことを意味すると仮定します。
void topntail(char *str) {
size_t len = strlen(str);
assert(len >= 2); // or whatever you want to do with short strings
memmove(str, str+1, len-2);
str[len-2] = 0;
}
これにより、pmgのソリューションのように新しいアドレスが生成されることなく、文字列が適切に変更されます。 pmgの答えに何か問題があるわけではありませんが、場合によっては望んでいるものではありません。
@pmgの答えに加えて、1つのステートメントで両方の操作を実行できることに注意してください。
char mystr[] = "Nmy stringP";
char *p = mystr;
p++[strlen(p)-1] = 0;
これはおそらく期待どおりに動作しますが、動作はC標準では定義されていません。
最も効率的な方法:
//Note destroys the original string by removing it's last char
// Do not pass in a string literal.
char * getAllButFirstAndLast(char *input)
{
int len = strlen(input);
if(len > 0)
input++;//Go past the first char
if(len > 1)
input[len - 2] = '\0';//Replace the last char with a null termination
return input;
}
//...
//Call it like so
char str[512];
strcpy(str, "hello world");
char *pMod = getAllButFirstAndLast(str);
最も安全な方法:
void getAllButFirstAndLast(const char *input, char *output)
{
int len = strlen(input);
if(len > 0)
strcpy(output, ++input);
if(len > 1)
output[len - 2] = '\0';
}
//...
//Call it like so
char mod[512];
getAllButFirstAndLast("hello world", mod);
2番目の方法は効率が劣りますが、文字列リテラルを入力に渡すことができるため、安全です。自分で実装したくない場合は、2番目の方法でstrdupを使用することもできます。