2016-12-12 5 views
0

私はユーザー入力を使用してプログラムを制御しています。私は2つの配列を持っています。gets()からの入力がchar配列に保存された値と一致しません

最初は、controlWordと呼ばれる1次元の文字配列です(これはユーザー入力を格納します)。

第2-Dアレイは、ユーザがI保存しgets()を使用する入力を求めるプロンプトが表示されている場合

char controlWord[100]; //control word compare it to promptWord 
char promptWord[5][100]={"Add","Subtract","Multiply","Divide","?"}; //for program control 

(コードプリフォームであろうアクションに対応する単語を含む文字列の配列)promptWordと呼ばれ最初のchar配列への入力次に、このchar配列を、ユーザーが入力する可能性がある潜在的なプロンプト・ワードで満たされた2番目のchar配列と比較します。

printf("\n\ncontrolword: "); 
gets(controlWord); 

if (strcmp(controlWord, promptWord[0]))//Add 
{ 
    //stuff 
}else if (strcmp(controlWord, promptWord[1]))//Listen 
{ 
    //more stuff 
}else 

私は部分文字列を検索したくありません。私は完全一致が欲しいだけです。文字列を慎重に入力してもうまく動作するはずですが、エラーが発生しています。 (「?」特に付き)

編集:ABC 『"。次のような文字列リテラルへのユーザーの入力を比較した場合には 『\ n』はバッファにgets/fgetsストア改行文字、また』 としてはhereを指摘それは決して一致しません "

今私はキャッチ22:私はgets()を使用することができます悪い練習、または私はfgets()新しいライン文字をつかむことができます使用することができます。最後の非ゼロ文字はゼロにすることができますが、入力が正確に99または100文字の場合はどうなりますか?私は自分のchar配列の最初の100文字のための部屋しか持っていないので、もし私が99文字+新しい行か100文字を持っていて、私は新しい行を失ったのですか?

私はgetsを回避するソリューションを探していますが、ヌル文字を検索する場合はfgetsよりもエレガントです。

+1

まず、読んで[ man gets](https://linux.die.net/man/3/gets): "gets()を使わないでください"。次に、Cのテキストブックを読んだり、Cで文字列を比較する方法を探します(ヒント: '=='ではありません)。 – kaylum

+2

[Cの文字列を正しく比較するにはどうすればよいですか?](http://stackoverflow.com/questions/8004237/how-do-i-properly-compare-strings-in-c) – kaylum

+0

@kaylumありがとう!あなたがリンクした質問からのこの[回答](http://stackoverflow.com/a/8004271/7126924)だけでなく、gets()/ fgets()の両方が改行文字を取得し、文字列リテラルと比較しようとします。 –

答えて

2

この問題は、fgetsを使用することをおすすめします。あなたが\nを検索し、それが正しい場所、n-1内に存在する場合、その後、ヌル終端文字\0に置き換えるこれによりこれ、

if (controlWord[slen-1] == '\n') { 
    controlWord[slen-1] = '\0'; 

あなたはこのような\n問題を扱うことができます文字列の終わりを示します。これが当てはまらない場合は、バッファオーバーフローが発生します。

あなたも賢い方法を使用することができます

は、上記のコメントに@melpomeneから強調表示:ここで

str[strcspn(str, "\n")] = '\0'; 

は、あなたのタスクを達成するのに役立ちます基本的な例である:

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

#define CONTROL_LEN 100 
#define NUM_COMMANDS 5 

int 
main(int argc, char *argv[]) { 
    char controlWord[CONTROL_LEN+1]; 
    char promptWord[NUM_COMMANDS][CONTROL_LEN]={"Add","Subtract","Multiply","Divide","?"}; 
    size_t slen, i; 
    int found = 0; 

    printf("controlword: "); 
    if (fgets(controlWord, CONTROL_LEN, stdin) == NULL) { 
     printf("Error reading command.\n"); 
     return 1; 
    } 

    slen = strlen(controlWord); 

    if (slen > 0) { 
     if (controlWord[slen-1] == '\n') { 
      controlWord[slen-1] = '\0'; 
     } else { 
      printf("Error: Exceeded Buffer length of %d.\n", CONTROL_LEN); 
      return 1; 
     } 
    } 

    if (!*controlWord) { 
     printf("Error: No command entered.\n"); 
     return 1; 
    } 

    for (i = 0; i < NUM_COMMANDS; i++) { 
     if (strcmp(controlWord, promptWord[i]) == 0) { 
      found = 1; 
     } 
    } 

    if (found) { 
     printf("Match found for command: %s\n", controlWord); 
    } else { 
     printf("No match found for command: %s\n", controlWord); 
    } 

    return 0; 
} 
関連する問題