28

のような C 文字列があります"Nmy stringP"。N と P は任意の文字です。"my string"Cで編集するにはどうすればよいですか?

4

4 に答える 4

66

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) */
于 2009-11-13T00:10:21.373 に答える
12

もう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の答えに何か問題があるわけではありませんが、場合によっては、それがあなたの望むものではありません。

于 2009-11-13T01:55:27.700 に答える
2

@pmgの回答に加えて、1つのステートメントで両方の操作を実行できることに注意してください。

char mystr[] = "Nmy stringP";
char *p = mystr;
p++[strlen(p)-1] = 0;

これは期待どおりに機能する可能性がありますが、C標準では動作が定義されていません。

于 2012-07-05T05:55:58.487 に答える
1

最も効率的な方法:

//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 を使用することもできます。

于 2009-11-13T00:17:25.293 に答える