получает () проблема в C - PullRequest
       11

получает () проблема в C

2 голосов
/ 12 апреля 2011

Я написал следующий код:

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

#define SIZE 128

int main ()

{
    char mychar , string [SIZE];
    int i;
    int const count =0 ;    

    printf ("Please enter your string: \n\n");
    fgets (string, SIZE, stdin);

    printf ("Please enter char to find: ");
    mychar = getchar();

    for (i=0 ; (string[i] == '\0') ; i++ )
        if ( string[i]  == mychar )
            count++;

    printf ("The char %c appears %d times" ,mychar ,count);

    return 0;
}

Проблема в том, что gcc выдает ошибку для 'int const count': "приращение переменной, доступной только для чтения," count "".

Что, кажется, не так?

Спасибо!

Ответы [ 7 ]

3 голосов
/ 12 апреля 2011

Попробуйте использовать fgets вместо:

fgets (string, SIZE, stdin);

Почему gets небезопасно, на SO получено несколько ответов. Вы можете видеть это .

1 голос
/ 22 мая 2012

Чтобы этот пример работал, вы также должны изменить строку:

if(*string == mychar) ++count;

на

if(string[i] == mychar) ++count;

Полный рабочий примерсейчас:

#include <stdio.h>

int main(int artc, char *argv[])
{
/* arguments are strings so assign only the first characte of the
 * third argument string. Remember that the first argument ( argv[0] ) 
 * is the name of the program. 
 */
char  mychar = argv[2][0];
char *string = argv[1];
int i, count = 0;

/* count the occurences of the given character */
for (i=0 ; (string[i] != '\0') ; i++ )
    if(string[i] == mychar) ++count;

printf("The char ‘%c’ appears %d times in the sentence: %s\n", mychar, count, string);

return 0;
}
1 голос
/ 12 апреля 2011

Всегда используйте fgets() вместо gets. Также есть много вещей, чтобы исправить. Вы не должны использовать стандартные библиотечные функции для создания пользовательского интерфейса. Стандартная библиотека действительно не предназначена для этого. Вместо этого вы должны использовать библиотека проклятий или что-то подобное. Вы также можете написать программу для принять аргументы в качестве входных данных.

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

#include <stdio.h>

int main(int artc, char *argv[])
{
    /* arguments are strings so assign only the first characte of the
     * third argument string. Remember that the first argument ( argv[0] ) 
     * is the name of the program. 
     */
    char  mychar = argv[2][0];
    char *string = argv[1];
    int i, count = 0;

    /* count the occurences of the given character */
    for(; *string != '\0'; ++string)
        if(*string == mychar) ++count;

    printf("The char ‘%c’ appears %d times.\n", mychar, count);

    return 0;
}

Использование: ./count "Hello, World!" l

Выход: The char ‘l’ appears 3 times.


РЕДАКТИРОВАТЬ: Что касается исходного кода. Измените == на !=.

for (i=0 ; (string[i] == '\0') ; i++ )

до:

for (i=0 ; (string[i] != '\0') ; i++ )

Сравнение было неверным.

0 голосов
/ 22 мая 2012

Это будет делать:

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

#define SIZE 128

int main()
{
  char mychar, string[SIZE];
  int i;
  int count=0;    

  printf("Please enter your string: ");
  fgets(string, SIZE, stdin);

  printf("Please enter char to find: ");
  mychar = getchar();

  for (i = 0; (string[i] != '\0'); i++)
    if (string[i] == mychar) ++count;

  printf("The char %c appears %d times in the sentence: %s" ,mychar ,count, string);

  return 0;
}
0 голосов
/ 12 апреля 2011

get опасно, потому что может принимать больше данных, чем размер переменной. Тем самым подвергая систему атакам и ставя под угрозу безопасность. fgets следует использовать, так как это ограничивает no. символов для чтения.

0 голосов
/ 12 апреля 2011

get опасен, потому что он позволяет вам читать больше данных, чем выделено для вас места, вы можете использовать fgets, который указывает, сколько символов он собирается прочитать, и останавливается, если находит новую строку.

0 голосов
/ 12 апреля 2011

Попробуйте заменить на "scanf( "%s", &string)".

...