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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

753閲覧

PHP標準関数のstrrev()のソースコードをPHPで知りたい

m055001

総合スコア72

C

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/11/08 10:56

PHP標準関数にstrrev()があります。
https://www.php.net/manual/ja/function.strrev.php

この関数のアルゴリズムを知りたいと思うのですが、私がCを扱ったことがなく、ソースコードを読むことができません。
https://github.com/php/php-src/blob/master/ext/standard/string.c#L3354-L3406

クレクレで大変恐縮なのですが、strrev()のソースコードをPHPで書かれたコードをいただくことは可能でしょうか。

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

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

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

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

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

melian

2021/11/08 11:17

要は、 while (e >= s) { *p++ = *e--; } なので、そんなに困難ではないでしょう。
m055001

2021/11/08 12:04

ありがとうございます。 ポインタがよくわかってないですが調べてみます。 ちなみにざっくりで結構なのですが、その上にあるif文は何をやってるのでしょうか?
melian

2021/11/08 12:22

ARMv8 以降の CPU のベクトル演算機能を使ってバイト列をひっくり返しています。
guest

回答2

0

リファレンスページの「User Contributed Notes」に書いてありますね。

投稿2021/11/08 12:15

otn

総合スコア85901

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

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

m055001

2021/11/08 12:48

ホントですね ありがとうございます汗
guest

0

Cのソースと同じ書き方だとあれっぽいので

php

1<?php 2$str = 'abcdefg'; 3$x = ''; 4foreach (str_split($str) as $c) $x = $c . $x; 5echo $x; 6?>

--- 追記 ---

Cの方のソースも同じようなろロジックなのでしょうか?

あれに寄せて書くとこんな感じでしょか。

php

1<?php 2$str = 'abcdefg'; 3$x = ''; 4$j=0; 5for ($i=strlen($str)-1;$i>-1;$i--) { 6 $x[$j] = $str[$i]; 7 $j++; 8} 9echo $x; 10?>

考え方は同じになるんスかね。

ちなみに、ループの試行回数を半分とかそれ未満にするようなロジックはありますか?
(たとえば何百万文字とかの場合、メモリオーバーとかタイムアウトすると思うのですが、それを回避するような)

そういう目的だったらオンメモリだと難しいと思うので
ファイルを介して処理するのが現実的でしょか。
で、使うなら(PHPなどより) C言語とかの方がいいでしょうねえ。
(向き/不向きのハナシです)

ちなみに tac コマンドがそういう働きをします。
ただし、そういう(チョーBIGな)ファイルが処理できるかどうかは分かりません。(汗

投稿2021/11/08 12:09

編集2021/11/08 21:10
takasima20

総合スコア7464

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

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

m055001

2021/11/08 12:53

ありがとうございます。 スッキリしててわかりやすいです。 このロジックだと文字数分ループすると思うのですが、Cの方のソースも同じようなろロジックなのでしょうか? (ポインタがわかっておらず、どういう動きになっているのかわからなくて) ちなみに、ループの試行回数を半分とかそれ未満にするようなロジックはありますか? (たとえば何百万文字とかの場合、メモリオーバーとかタイムアウトすると思うのですが、それを回避するような)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問