Изменение программы для запуска в качестве аргументов командной строки в C - PullRequest
0 голосов
/ 25 февраля 2019

Полное раскрытие, это задание для класса, который я должен сделать.У нас есть программа, которая проверяет, являются ли два слова анаграммами.Мы должны изменить его так, чтобы мы могли вводить слова как командные строки в программе.Например: (./a.out hello elloh: это анаграмма ... ./a.out hello world: не анаграмма).

Вот оригинальная программа:

#include <stdio.h>
#define N 26

int main()
{


    char ch;
    int letter_counts[N]= {0};
    int i;
    int count =0;

    printf("enter a word: ");

    while((ch=getchar())!= '\n')

    {
        letter_counts[ch - 'a']++;

    }

    for(i =0;i<N;i++)
        printf("%d", letter_counts[i]);


    printf("enter the second word: ");
    while((ch=getchar())!= '\n')

    {
        letter_counts[ch - 'a']--;

    }

    for(i =0;i<N;i++)
        printf("%d", letter_counts[i]);

    for(i =0;i<N;i++)
        if(letter_counts[i]==0)
            count++;


    if(count == N)
        printf("The words are anagrams.\n");
    else

        printf("The words are NOT anagrams.\n");


    return 0;
}       

Теперь вот что у меня есть:

#include <stdio.h>
#define N 26

/*
  This program is a modified version of anagram.c so that the words run as command-line arguments.   
*/
int main(int argc, char *argv[])
{
  if(argc != 3)
  {
    printf("Incorrect number of arguments");
    return 0;

  }
  char ch;
    int letter_counts[N]= {0};
    int i;
    int count =0;
  //int k;
  //for (k = 1; i < argc; i++) 
  //{
    while((ch=getchar())!= '\n')
      {
          letter_counts[ch - 'a']++;
    }

      for(i =0;i<N;i++)
          printf("%d", letter_counts[i]);

      while((ch=getchar())!= '\n')  
      {
          letter_counts[ch - 'a']--;
      }

      //for(i =0;i<N;i++)
        //printf("%d", letter_counts[i]);

      for(i =0;i<N;i++)
          if(letter_counts[i]==0)
              count++;

    int k;
    int j;
    for (k = 1; i < argc; i++)
    {
      for (j = 0; j < N; j++)
      {
        if (count == N) 
        {
          printf("%s and %s are anagrams\n", argv[k], argv[k + 1]);
          break;
        } 
        else
          printf("The words are NOT anagrams. \n");
      }
    }

    if(count == N)
          printf("The words are anagrams.\n");
     else
        printf("The words are NOT anagrams.\n");
  //}




    return 0;
}       

Вывод (если число аргументов верное) всегда:

0000000000000000000000000
0000000000000000000000000
These are anagrams

Что я здесь делаю неправильно иКаков наилучший способ сделать это?

Спасибо за любую помощь, я действительно ценю это.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Чтобы не решить домашнюю работу за вас, я покажу вам, как использовать argc и argv в другой программе, которая просто проверяет, равен ли первый измененный параметр второму:

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

int main(int argc, char **argv)
{
    if (argc != 3) {
        printf("Usage: %s first_word second_word\n\n", argv[0]);
        return EXIT_SUCCESS;
    }

    char const *first = argv[1];
    char const *second = argv[2];

    size_t first_length = strlen(first);
    size_t second_length = strlen(second);

    if (first_length != second_length) {
        puts("The words are NOT semordnilaps.\n");
        return EXIT_SUCCESS;
    }

    for (size_t first_index = first_length, second_index = 0; first_index; --first_index, ++second_index) {
        if (first[first_index - 1] != second[second_index]) {
            puts("The words are NOT semordnilaps.\n");
            return EXIT_SUCCESS;
        }
    }

    puts("The words are semordnilaps.\n");
}
0 голосов
/ 25 февраля 2019

Модифицированная программа torun из аргумента командной строки.Ниже приведен рабочий фрагмент кода для вас.Здесь мы передаем два аргумента командной строки с именем программы.while ((ch = argv [1] [len])! = '\ 0') извлекает символ char из первых аргументов, а while ((ch = argv [2] [len])! = '\ 0') получаетто же самое со второй и остальной логикой остается тем же.

#include <stdio.h>
#define N 26

int main(int argc, char *argv[])
{
    if( argc != 3)
    {
        printf("Incorrect argumemts\n");
        return 0;
    }
    char ch;
    int letter_counts[N]= {0};
    int i;
    int count =0;

    int len=0;
    while ((ch = argv[1][len]) != '\0')
    {
        letter_counts[ch - 'a']++;
        len++; /* moving index */
    }

    for(i =0;i<N;i++)
        printf("%d", letter_counts[i]);

    len=0;
    while ((ch = argv[2][len]) != '\0')
    {
        letter_counts[ch - 'a']--;
        len++; /* moving index */
    }

    for(i =0;i<N;i++)
        printf("%d", letter_counts[i]);

    for(i =0;i<N;i++)
        if(letter_counts[i]==0)
            count++;

    if(count == N)
        printf("The words are anagrams.\n");
    else

        printf("The words are NOT anagrams.\n");


    return 0;
}
0 голосов
/ 25 февраля 2019

Вы используете getchar(), который читает из STDIN, а это не то, что вы хотите делать, если вы получаете слова из аргументов командной строки.Вместо этого вы хотите посмотреть на argv:

for (char *c = argv[1]; *c != NULL; c++) {
    letter_counts[*c - 'a']++;
}

и

for (char *c = argv[2]; *c != NULL; c++) {
    letter_counts[*c - 'a']--;
}

Подробнее о argc и argv: http://crasseux.com/books/ctutorial/argc-and-argv.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...