0

引数リストargv[]をスキャンして、重複する文字があるかどうかを判断しようとしています。いくつか試してみましたが、何もうまくいかないようです。私はCで本当に新しいので、私の恐ろしいコードに耐えてください:

char unavailableLetters[26] = "";
int pos = 0;
for(i = 0; i < (argc-1); i++) {
    int size = strlen(argv[i+1]);
    for(j = 0; j < size; j++) {
        char c = argv[i+1][j];

        if(j == 0) {
            unavailableLetters[pos] = c;
            pos+=1;
            } else {

            char *s = strchr (unavailableLetters, c);
            if(s == NULL) {
                unavailableLetters[pos] = c;
                pos += 1;
            }
        }
    }
}

ここでの私のロジックは、すべての引数を解析してから各文字を解析し、最初にそれがavailableLettersの配列に含まれているかどうかを確認し、含まれていない場合は追加して先に進むことです。しかし、私が何をしようとしても、それらはすべて追加されるか、まったく追加されません。これはおそらく最善の方法ではありませんが、アイデアがありません。

  1. リスト項目
4

3 に答える 3

0

別の方法を次に示します。各文字にカウンターを使用し、複数回出現するすべての文字を表示します。

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

int main(int argC, char *argV[])
   {
   int arg;
   char *cp;  
   int counters[256];

   /* Set all counters to zero. */
   memset(counters, 0, sizeof(counters));

   /* Iterate through each character of each argV */
   for(arg=1; arg<argC; ++arg)  // Change to "for(arg=0;..." to include argV[0]
      for(cp=argV[arg]; *cp; ++cp)
         ++counters[(int)*cp];  //Change to "++counters[toupper(*cp)];" to ignore case.

   /* Print characters that occurred more than once. */ 
   printf("Duplicate character list: ");   
   for(arg=0; arg<256; ++arg)
      if(counters[arg] > 1)
         printf("%c ", arg);

   printf("\n");   

   return 0;
   }
于 2014-05-29T05:18:48.347 に答える
0

これは、私が簡単にテストしたソリューションです。小文字のみで動作し、文字の ascii 値が連続しているという事実を利用します (ascii a は 97 であるため、インデックスを割り当てるときに 97 を減算し、文字を出力するときに加算し直します)

#include <iostream>
using namespace std;

int main (int argc, char *argv[])
{
    int letters[26];

    for (int i = 0; i < 26; i++) {
        letters[i] = 0;
    }

    for (int i = 1; i < argc; i++) {
        cout << "processing word: " << argv[i] << endl;
        char *word = argv[i];
        for (int j = 0; j < strlen(word); j++) {
           cout << "\tprocessing letter: " << word[j] << endl;
           letters[(int)word[j]-97]++;
        }
    }

    cout << "Letters that appear only once: " << endl;
    for (int i = 0; i < 26; i++) {
        if (letters[i] == 1)
            cout << (char) (i+97) << endl;
    }

    return 0;
}
于 2014-05-29T02:48:59.937 に答える