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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

2328閲覧

base64変換プログラム完成したと思ったのですが、、、

szbhdulla

総合スコア15

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2016/12/14 13:28

編集2016/12/14 14:25

###前提・実現したいこと
入力した文字列をbase64で変換するプログラムを改良したものが完成したと思ったのですが、、、

###発生している問題・エラーメッセージ
以前https://teratail.com/questions/53500にて質問させて頂いた際にご教授頂いたecho文を使い正しい出力かみるという方法を試してみると以下のような現象が起こりました。

$ echo -n 'Hello World' | base64 SGVsbG8gV29ybGQ= /*正しい*/ $ echo -n 'Hello World' | ./base64 SGVsbG8gV29ybA== /*正しくない*/ $ ./base64 Hello World SGVsbG8gV29ybGQ= /*正しい*/

ご指摘があったので追記させていただきます。
./base64は自分の作った実行ファイルを起動シています。

echoとパイプラインをつかった出力では誤った値が出てくるのです。通常どおりに起動すると正しい値が表示されるのですが、、、
どうすれば改善するかを教えていただきたいです。

また良ければこのソースコードにダメ出しや改善点を教えてほしいです。
###該当のソースコード
base64.c

c

1#include <stdio.h> 2#include "base64.h" 3 4int main(void){ 5 6 char pre_encode[MAX_INPUT]; //入力値 7 fgets(pre_encode, sizeof(pre_encode), stdin); 8 9 int length = len(pre_encode); 10 11 //decへエンコード 12 int dec_encoded[MAX_INPUT]; //エンコード先 13 ToDec(pre_encode, dec_encoded, length); 14 15 //binへエンコード 16 int bin_encoded[MAX_INPUT][bitNum]; //エンコード先 17 allDecToBin(dec_encoded, bin_encoded, length); 18 19 //一列にsort 20 int sorted[MAX_INPUT*length]; 21 sort(bin_encoded, sorted, length); 22 23 //6つに分割 24 int column_6 = (length*bitNum-1)/6+1; //商+1 = 行数 25 int divided_6[column_6][6]; 26 divide_6(sorted, divided_6, length*bitNum); 27 28 //文字列に変換 29 char post_lib[column_6]; 30 enLibrary(divided_6, post_lib, column_6); 31 32 //最終整形 33 int resultLen = column_6+4-(column_6%4); 34 char post_output[resultLen]; 35 last_encode(post_lib, post_output, column_6); 36 37 for(int i=0; i<=resultLen-1; i++){ 38 printf("%c", post_output[i]); 39 }printf("\n"); 40 41 return 0; 42}

その他のファイルはhttps://github.com/szbhdulla/base64にあります。

###補足情報(言語/FW/ツール等のバージョンなど)
シェル bash
OS archlinux
コンパイラ gcc

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

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

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

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

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

KSwordOfHaste

2016/12/14 13:57 編集

最初のechoのテストをしたディレクトリーでwhereis base64としたら何が表示されますか?そこに表示されたものは今作成中のbase64プログラムそのものですか? ->失礼、上の方はlinuxの標準のbase64のことであることがおわかりなのですね?
szbhdulla

2016/12/14 14:22

はい、base64はlinuxの標準のもので、./base64は自分が作ったものを起動シているということはわかっています。
KSwordOfHaste

2016/12/14 14:25

以前の質問でlenをテストしてみることを提案しましたが、ソースが変わっていないように見えます。デバッグされたのでしょうか?(念のため、自分はlength.cしかみていませんのでこのソースだけに問題があるかどうかは分かりません。)
szbhdulla

2016/12/14 14:27

教えていただいたとおりにlenのテストは下のですが誤った出力はされませんでした。申し訳ないですが、何が異なるのかを教えていただけませんでしょうか。
KSwordOfHaste

2016/12/14 14:31

len("") とすると結果は-1になります。この結果は自分には間違っているように見えました。
szbhdulla

2016/12/14 15:19

ありがとうございます。こう解釈シたのですが、誤りでしょうか?私の作ったプログラムはキーボードによる入力を前提とシている。しかしechoはキーボード入力では無いので入力値の文字数が-1されて読み込まれて正確な値が表示されない。こういうことでしょうか?
KSwordOfHaste

2016/12/14 15:47

いえ、単に次のことを指摘しているつもりです。len関数が仕様どおりになっていないのではないかということです。len関数が指定文字列の長さを返すものだとすればlen("")は0を返すべきと考えられます。しかし実際は-1を返すのでlen()関数にバグがあるように見えるというだけです。
otn

2016/12/14 16:24

何故コードの全体を載せないのでしょう?他のサイトを見に行って複数のファイルを見て回る気はしないです。少なくとも私は。
guest

回答3

0

回答ではないのですが、質問に対するコメント欄でのやりとりで自分の意図がうまく伝わっていない気がしたのでここに申し上げたいことを整理させていただきます。

echoとパイプラインをつかった出力では誤った値が出てくるのです。通常どおりに起動すると正しい...(A)

この点について自分は「そうなるかどうかやそうなる理由について」は特にアドバイスできることがありません。

また良ければこのソースコードにダメ出しや改善点を...(B)

自分はこの点についてのみコメントしているつもりです。前回の質問の回答において自分は「lenに問題(バグ)がある」と指摘しました。今回の質問でもlenは修正されていなかったので引き続き指摘しています。指摘の根拠は以下の通りです。

  • len()の仕様(わたしがこうであろうと思った内容)

指定文字列の長さ(つまりNUL文字を除いたcharデータの数)を返す関数と思えたのでそう仮定しました。本来質問者さんが意図した仕様がこのとおりでなければ私の指摘は誤りである可能性もあります。

  • lenの実装(ソースに基づき実際に動かした結果)

実際に動かすとわかりますが、以下のようなプログラムを動かすと結果として-1が表示されます。

c

1int length = len(""); 2printf("%d", length); 3-> -1が表示される

この結果はlenの仕様が上に書いたとおりなら0であるべきなので「問題がある」と指摘しました。自分が指摘しているのはbase64プログラム全体の動きのことではなくてlen関数単体の動作についてだけなのです。なぜそういう指摘をするのかといえばプログラム全体が正しく動くためには「全ての関数がそれぞれの仕様に従って正しく動くことが必要条件になるから」です。

投稿2016/12/14 16:17

KSwordOfHaste

総合スコア18394

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

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

0

ベストアンサー

len()がおかしいというのはあなたの質問で割りと何度も指摘されています。

じゃあなんでechoで正しくうごかなくて、直接起動だとうまくいくように見えるかですが、

実のところ直接起動でも正しく動いていません。
"Hello World"を入力していると思いますが、
渡されているのは"Hello World**\n**"です。

あなたのプログラムは1文字落とすというバグがあるようなので、
"Hello World"を入力したつもりで"Hello World\n"を渡し、
"Hello World\nが一文字落ちてしまって"Hello World"になってうまく動いているように見えるだけです。

投稿2016/12/15 00:07

ozwk

総合スコア13528

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

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

szbhdulla

2016/12/15 01:52

そうだったんですね。改行文字のことを完全にわすれていました。読み込んだ値から改行文字があれば消すようにして再度検討してみます
guest

0

プログラムは読んでませんが、

$ echo -n 'Hello Worl' | base64 SGVsbG8gV29ybA==

なので、最後の1文字を落とすというバグがあるものと思います。
KSwordOfHasteさんの指摘通りじゃないでしょうか。
前の質問の回答を消化してから、次の質問をするのがいいと思いますよ。

投稿2016/12/14 16:36

otn

総合スコア84557

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問