Я должен найти найти буквы среди строк - PullRequest
0 голосов
/ 21 марта 2019

Я должен написать код, чтобы сделать двойные к действительным числам, но у меня много проблем с этим.

"# 5p56.02 #" с этим входом у меня должен быть "Invalid! Отсканированный символ p среди входных данных" или "### 33 ## 5" с этим он должен дать мне вывод "Invalid!последовательность пробелов между незаполненными символами. "(# означает пробел, хотя)

#include <stdio.h>

int main()
{
   char str[20];
   int i, frequency = 0;

   printf("Enter a string: ");
   gets(str);

   for(i=0;str[i]!='\n'; ++i)
   {
       if(' '== str[i])
           ++frequency;
   }

   printf("Frequency of %d", frequency);

   return 0;
}

Я застрял с этим, и я не знаю, что мне делать.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Чтобы обнаружить "Неверно! Между непробельными символами есть последовательность пробелов." , я бы убрал символы пробелов из начала и конца строки; если пробел остается, он находится между другими символами:

    char *sp = str;
    while (*sp == '#') ++sp;                    // skip over the leading gaps
    char *ep = sp+strlen(sp);                   // string end position
    while (ep > sp && *--ep == '#') *ep = '\0'; // erase trailing gaps
    if (strchr(sp, '#'))
        puts("Invalid! There is a gap sequence between non-blanket characters."),
        exit(1);

Чтобы обнаружить условие «Неверно! Отсканированный символ p среди входных данных» , я просто попытался бы преобразовать в double и проверить, были ли нераспознанные символы:

    double real = strtod(sp, &ep);              // try to convert double
    if (*ep || ep == sp)                        // conversion failed at ep
        printf("Invalid! scanned p character among input\n", *ep), exit(1);
    printf("%f\n", real);
0 голосов
/ 21 марта 2019

% s будет сканировать до следующего пробела, вы не можете сканировать несколько слов без определенной маски.

Вы можете использовать маску "[^ \ n]", эта маска будет сканировать все, пока не появится \ n

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

int main(void){
   char string[50];
   int i, frequency = 0;

   printf("Enter a string: ");
   scanf("%[^\n]", string);

  for(i=0;i<strlen(string);i++)
   {
       printf("%c,", string[i]);
       if(string[i] == ' ') {
           frequency++; 

       }
   }

   printf("Frequency of %d", frequency);

   return 0;
}

Проблема в том, что с этой маской вам нужно будет выяснить, как остановить цикл, я попробовал использовать онлайн-компилятор и у меня были некоторые проблемы с использованием строки [i]! = '\ N'

Редактировать: обновлено с использованием strlen, и у меня все работает нормально

 printf("%c,", string[i]);

для причины отладки.

Проверьте это, чтобы узнать больше о масках http://personal.ee.surrey.ac.uk/Personal/R.Bowden/C/scanf.html

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