2011-09-14 17 views
0

MySQLデータベースに接続しようとすると、迷惑な警告が表示されます。私はこれらの警告を取得しますが、私は、私はそれらを取り除くことができるか表示されていない事実として警告Cコード(MySQLデータベースへの接続)

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <mysql/mysql.h> 
#include <string.h> 

const char* host = "localhost"; 
char *database="Dbis_RG"; 
char user_name[10]; 
char passwd[10]; 

MYSQL_ROW row; 
MYSQL_RES* result; 
MYSQL_FIELD* field; 

int main() 
{ 

    system("clear"); 


    printf("Insert yur user name: \n"); 
    scanf("%s", &user_name); 

    printf("Insert your passwd: \n"); 
    scanf("%s", &passwd); 


    MYSQL *conn; 

    conn = mysql_init(NULL); 


    /* Connection to database */ 
     if (!mysql_real_connect(conn, host, 
      user_name, passwd, database, 0, NULL,CLIENT_MULTI_STATEMENTS)) { 
      fprintf(stderr, "%s\n", mysql_error(conn)); 
      exit(EXIT_SUCCESS); 
      } 



     printf ("Connection successful.\n"); 


} 

1.0.c: In function ‘main’: 
1.0.c:23: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’ 
1.0.c:26: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’ 

はどうもありがとうございました。ここ

コードです

マウロ

+9

こんにちは@Mauro! Stack Overflowに参加していることにとても興奮しています。しかし、過去にいくつかの質問をしてきましたが、回答を受け入れていないことに気付きました。 **あなたは前の質問への回答を受け入れるでしょうか?**これは緑色のチェックマークをクリックすることで行うことができます。 –

答えて

0

ユーザー名とpasswdはすでに配列されているので、あなたは「を取り除く必要があります"となります。

+0

これはポインタではなく配列です... – sidyll

+0

あなたが望むものを呼び出します。それらはメモリアドレスです:) – brain

+0

@brain:[c-faq](http://c-faq.com/)のセクション6を読んでください。そして、そこにいたら、他のセクションも読んでください:P – pmg

3

あなたはこのようにそれを行うことができます:

scanf("%s", user_name); 
scanf("%s", passwd); 

しかし、それは良い考えではありません。代わりにfgetsを使用してください。マニュアルページを確認してください。さらに詳細を知りたい人には、あなたの質問に答えてもらうようにしましょう。

+0

あなたの答えに感謝します。それは実際には動作しますが、それは良いアイデアではないと言います...それはansi Cではないという意味ですか?私がfgetsを使用すると、同じ方法で問題を解決しますか?ありがとう – Margherita

+0

@マウロ - @ Tomerがすでに言ったことを読んで、間違いを修正してください!彼はアンシCではないと言わなかった。彼はあなたが書いたことがセキュリティホールであり、危険であると言った。 –

+0

また、fgetsを使用したくない場合は、%9s(空白なし)または%9c(空白)を9文字だけ読み取るようにscanf( "%9s" 、user_name); – thang

2
  1. 脳は何を言った。
  2. 安全でない方法でscanf()を使用しています。私の名前が10文字を超える場合、またはプログラムを中断したい場合は、scanf()コールが配列を超えてオーバーフローします。代わりにscanf("%9s", user_name);を使用してください(最後に'\0'の部屋を残す必要があると思います)。
-1

私はstrlenを使用して問題を解決しました...私はstrlenを通して入力をチェックし、指定された配列サイズより大きい場合、適切な警告がユーザに続くことを妨げます...あなたはそれが良いアイデアだと思いますか? ?

+1

いいえ! scanfの後で、予約されたスペースよりも多くの文字が読み込まれた場合、その害は既に行われています。警告で害を元に戻すことはできません。 – pmg

関連する問題