字符串到数组然后在c中打印

时间:2016-09-25 02:55:57

标签: c arrays

我正在尝试使用用户输入的字符串并查看每个代码以查看它是否出现在另一个字符串字符串中。到目前为止我的代码工作。 如果成功找到该单词,则将alpha表示添加到最终将被打印的数组中,但仅在找到所有代码时才会添加。

我遇到的问题是存储在我要打印的数组中。

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

typedef char *string;
typedef char *alpha;

int main(void)  
{
   string morse[4]={".-", "-...","----.", ".."};
   string alpha[4]={"A",  "B",   "9",     "I"};
   char prntArr[50];
   char *input;
   char *hold;
   input = malloc(200);
   hold = malloc(50);
   int i=0;
   int j=0;
   int ret;
   int x;
   int w=0;
   int z=0;
   printf("please enter a string\n");
   scanf("%[^\n]",input);

   do{
      if (input[i] !=' ')
      {
         hold[j] = input[i];
         j++;
      }
      else
      {
         hold[j]='\0';                

         for (x=0;x<4;x++)
         {
            printf("value of x  %d\n",x);

            ret = strcmp(morse[x], hold);
            if (ret==0)
            {
               printf("%s\n",alpha[x]);

               prntArr[w]=*hold;
               w++; 
               x=4;
            }
            else
            {
               ret=1;
               printf("invalid Morse code!");

            }
         }
         j = 0;
      }
      i++;
   }while(input[i] !='\0');

   for (z=0;z<50;z++)
   {
      printf("%c",prntArr[z]);
   }

   return 0;
   free(input);       
}

1 个答案:

答案 0 :(得分:1)

您询问的问题是由程序中prntArr的使用方式引起的。它应该是一个到alpha数组的字符指针数组。相反,它被操纵为一个字符数组,每个莫尔斯代码元素的第一个字符存储在其中。当它被打印时,跟踪使用了多少数组的变量就被忽略了。

另一个问题是你的代码使用空格来破坏代码,但行末不一定有空格,因此代码可能会被遗漏。在下面的程序中,我为scanf()切换了fgets(),在输入的末尾留下了换行符,我们可以使用它,如空格,以表示代码的结束。

其他问题:您在代码中的错误位置打印invalid Morse code消息,然后将其打印到stdout而不是stderr;你记得免费input,但忘了免费hold;你把代码放在永远不会被调用的return之后。

下面是代码的返工,解决了上述问题以及一些样式问题:

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

int main(void)
{
    char *morse[] = {".-", "-...", "----.", ".."};
    char *alpha[] = {"A" , "B"   , "9"    , "I" };

    char *print_array[50];
    int print_array_index = 0;

    char hold[50];
    int hold_index = 0;

    char input[200];
    int i = 0;

    printf("please enter a string: ");
    fgets(input, sizeof(input), stdin);

    while (input[i] !='\0') {

        if (input[i] ==' ' || input[i] == '\n')
        {
            hold[hold_index] = '\0';

            bool found = false;

            for (int x = 0; x < sizeof(morse) / sizeof(char *); x++)
            {
                if (strcmp(morse[x], hold) == 0)
                {
                    print_array[print_array_index++] = alpha[x];

                    found = true;

                    break;
                }
            }

            if (!found)
            {
                fprintf(stderr, "invalid Morse code: %s\n", hold);
            }

            hold_index = 0;
        }
        else
        {
            hold[hold_index++] = input[i];
        }

        i++;
    }

    for (int x = 0; x < print_array_index; x++)
    {
        printf("%s ", print_array[x]);
    }

    printf("\n");

    return 0;
}

SAMPLE RUNS

> ./a.out
please enter a string: ----. -... .- ..
9 B A I 
> 

> ./a.out
please enter a string: .- --- ..
invalid Morse code: ---
A I 
>