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

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

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

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

Q&A

解決済

2回答

2508閲覧

ランダム文字列の保存、出力について

testuserr

総合スコア2

C

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

0グッド

0クリップ

投稿2020/11/02 09:12

前提・実現したいこと

C言語習い始めです。
ランダムな文字列を作成し、それらをディレクトリとデータベースにそれぞれ登録しようと考えています。作成はできたのですが、それを保存・登録する際にディレクトリとデータベースでの文字列が異なって登録されてしまいます。
どこに原因があるのかが分からなかったため、質問させていただきました。

発生している問題・エラーメッセージ

「abcdefg」でランダム文字列がされた際、ディレクトリには「abcdefg」と登録されるがデータベースには「urhfajd」など別の文字になってしまう
文字数は同じ、文字の変換に規則性はなし

該当のソースコード

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include <time.h> 5int main(void) 6{ 7 int i; 8 char random[30]; 9 char name_ran[30]; 10 char check[200]; 11 12 // a~zのランダム文字列作成 13 srand((unsigned) time(NULL)); 14 for (i=0; i<5; i++) { 15  random[i] = 'a' + rand()%26; 16 } 17 // randomをname_ranに文字列で記入 18 sprintf(name_ran, "%s\n", random); 19 //homeディレクトリにname_ranの名前で作成 20 sprintf( check, "mkdir /home/'%s'", name_ran ); 21 system( check ); 22 23 // mysqlへの登録 24 sprintf( sql_str, "INSERT INTO `user` (`name`, `name_ran`, `password`) VALUES ('%s', '%s', '%s')", name, name_ran, password ); 25} 26

試したこと

・random = "testname";
であればどちらも「testname」で登録されます
・for文の後にrandom[5] = 'a';
を付けると、6文字目はどちらも「a」になります

補足情報(FW/ツールのバージョンなど)

文字列リテラルであれば入ることは分かったのですが、1文字ずつ配列に加え、文字列として新しく書き直したと考えています。
それともランダム文字列の作成方法が、この書き方だと異なるのでしょうか?ご教授いただきたいです。

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

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

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

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

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

guest

回答2

0

遅くなりましたが、自己解決しました。
ソースコードでは省略していますが、mkdirした後に初期化しておりました。そのため、DBに登録したランダム文字列を取り込む、という処理がもう一度なってしまい、別のランダム文字列が作られる…といった内容になっておりました。
ありがとうございました。

投稿2020/11/05 23:39

編集2020/11/05 23:41
testuserr

総合スコア2

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

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

0

ベストアンサー

randomに末端の\0を書き込んでいないので、この文字列はどこで終わるか判定できない状態になっています。結果、関係ないところまではみ出して書き込まれているものと推測されます。

random[5] = '\0';できちっと終端させたら、どうなりますでしょうか?

投稿2020/11/02 09:15

編集2020/11/02 09:15
maisumakun

総合スコア146018

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

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

testuserr

2020/11/02 09:24

回答ありがとうございます。 ご指摘いただいたrandom[5] = '\0';で試してみましたが、データベースとディレクトリの文字がそれぞれ異なって出力されました。
maisumakun

2020/11/02 09:31 編集

mkdirで「改行コード入り」のフォルダを作ろうとしているのは意図的なものでしょうか? ちなみに、DB出力とフォルダ作成を単なるprintfに置き換えてやってみましたが、特に問題なく文字列が生成されていました(全角スペースが警告されまくったので、それは半角スペースに置き換えました)。 https://paiza.io/projects/76q6YihApNG28LG-QCVDyw?language=c
testuserr

2020/11/02 09:39

改行コードは色々試したのを消していなかっただけです、失礼しました。 paizaだときちんと出力されますね…。了解しました。 ちなみに今思ったことですが、srandはmysql接続して切って…などと時間がかかるとランダム文字も変更されることはありますでしょうか?
maisumakun

2020/11/02 09:44

まともな(未定義動作に突っ込まない)プログラムであれば、ありません。 SQL生成の部分で変数が足りていなかったりしますが、例示したコードで宣言すら削られている変数の処理の過程で、おかしなことをやっているのかもしれません。
testuserr

2020/11/02 09:54

分かりました。自分がここかなと思った部分で質問させていただきましたが、別の部分かもしれません。 関連している所を探していきます、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問