-2

C最小限の(おそらくワンライナー)ソースコード行で文字列を逆にする方法はありますか。C++ は、ここで#include <algorithm>提案されているように使用することでそれをサポートします。Cもそのようなメカニズムをサポートしているのだろうか。

4

7 に答える 7

7

これは、ライブラリ関数を使用しないワンライナーです(変数を宣言する必要があります):-

char s [] = "hello world";
char *p,*q;
for (p=s,q=0;p>q;q?*p^=*q,*q^=*p,*p--^=*q++:!*++p?q=s,*--p:0);

コードの仕組みの説明:-

変数:-

  • p: 文字列ポインタの終わり、文字列の先頭に初期化され、末尾を見つけるために使用されます
  • q: 2 つの目的、文字列の開始点を指し、状態に使用

州:-

  • q == 0: for ループは入力文字列の末尾を検索しています。末尾を見つけるために p がインクリメントされています。
  • q != 0: for ループは文字列の前半と文字列の後半の文字を交換しています

終了:-

文字列の前半へのポインタが文字列の後半へのポインタを超えると、ループは終了します。文字列の末尾を検索している間、前半 (q) へのポインターは 0 であるため、条件は常に真です。

増分:-

for ループの 3 番目の部分は状態に依存し、次のように分割できます。

if state is searching for end of string (q == 0)
  increment end of string pointer (++p)
  if end of string pointer is pointing at null terminator (*p == 0)
    set start of string pointer and set state to swapping characters (q=s)
    decrement end of string pointer (--p)
  endif
else
  swap characters (the three ^=)
  move first and secondhalf pointers (--p, ++q)
endif

*が明らかに不必要である理由*--pは、三項演算子のすべての部分が同じ型を持つようにするためです。

これらすべてを理解すれば、コード内のバグを見つけることができます。

于 2013-07-17T10:51:23.903 に答える
5

「最小行数」の要件はあまり意味がありません(結局のところ、プログラム全体を 1 行で書くことができます)。インプレースリバーサルを希望する場合は、かなり軽量な実装を行うことができます。

void strrev(char *s) {
    char *p = s + strlen(s);
    while ( s + 1 < p ) {
        char tmp = *s;
        *s++ = *--p;
        *p = tmp;
    }
}
于 2013-07-17T10:42:07.890 に答える
2

いいえ、文字列 (または他のシーケンスや範囲) を反転するための標準 C ライブラリ ルーチンはありません。

于 2013-07-17T10:38:59.367 に答える
1
#include <stdio.h>

int strrev_r(char *str, int pos){
    char ch = str[pos];
    return (ch == '\0')? 0 : ((str[pos=strrev_r(str, ++pos)]=ch), ++pos);
}
void strrev(char *str){
    strrev_r(str, 0);
}

int main(){
    char string[] = "string";
    strrev(string);
    puts(string);
    return 0;
}
于 2013-07-17T11:44:36.747 に答える
0

1 つのライナーに 1 つを主張すると、1 つのライナーが得られます。

for(int i = -1, len = strlen(s), t = 0; ++i < len / 2; t = s[i], s[i] = s[len - 1 - i], s[len - 1 - i] = t);
于 2013-07-17T10:50:05.500 に答える
0

こんにちは、これは1行ではありませんが、完全に機能します

#include<stdio.h>
#include<string.h>

char *revstr(char *str)
{
  int   i;
  int   size;
  int   max;
  char  save;

  i = 0;
  size = strlen(str);
  max = size / 2;
  while (i < max)
    {
      save = str[i];
      str[i] = str[size - 1 - i];
      str[size - 1 -i] = save;
      i = i + 1;
    }
  return(str);
}

int main()
{
  char *str;

  str = strdup("hello");
  str = revstr(str);
  printf("%s\n", str);
}
于 2013-07-17T10:43:47.267 に答える