Ошибка сегментации в программе, которая считает цифры, строчные буквы и знаки препинания в вводимых пользователем строках

0

Написание программы, которая запрашивает ввод пользователя из 3 строк. Затем программа берет каждую строку и подсчитывает количество цифр, строчных букв и знаков препинания. Программа компилируется, но после того, как пользователь вводит первую строку, возникает ошибка сегментации, и программа вылетает из строя. Когда я запускаю программу, это результат:

Введите первую строку: 1 Введите вторую строку: введите вторую строку: 2 Ошибка сегментации

Не уверен точно, что произошло, но любая помощь была бы потрясающей! Благодарю.

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

int countDigit(char *s);
int countLower(char *s);
int countPunct(char *s);

int main (void)
{
        int digit, lower, punct;
        char *first;
        char *second;
        char *third;
        char *c;

        printf("Enter the first string\n:");
        scanf("%99s", first);
        printf("Enter the second string\n:");
        scanf("%99s", second);
        printf("Enter the second string\n:");
        scanf("%99s", third);

        digit=countDigit(first);
        lower=countLower(first);
        punct=countPunct(first);

        printf("There are %d digits, %d lower case letters and %d punctuation chars in a\n", digit, lower, punct);

        digit=countDigit(second);
        lower=countLower(second);
        punct=countPunct(second);

        printf("There are %d digits, %d lower case letters and %d punctuation chars in b\n", digit, lower, punct);

        digit=countDigit(third);
        lower=countLower(third);
        punct=countPunct(third);

        printf("There are %d digits, %d lower case letters and %d punctuation chars in c\n", digit, lower, punct);

}

int countDigit(char *s)
{
        int count = 0;
        char temp;
        while(*s !=0)
        {
                temp = *s;
                if (isdigit(temp))
                {
                        count++;
                }
                s++;
        }
        return count;
}

int countLower(char *s)
{
        int count = 0;
        char temp;
        while (*s !=0)
        {
                temp = *s;
                if (islower(temp))
                {
                        count++;
                }
                s++;
        }
        return count;
}

int countPunct(char *s)
{
        int count = 0;
        char temp;
        while (*s !=0)
        {
                temp = *s;
                if (ispunct(temp))
                {
                        count++;
                }
                s++;
        }
        return count;
}
  • 0
    Просто предложение для будущих вопросов. Вы должны стараться, чтобы ваши вопросы были короткими, но содержательными . Поскольку после ввода вы получаете ошибку сегментации, вы можете быть уверены, что проблема находится в начале, а все остальное можно оставить. Также в вашем вопросе нет элементов c ++, поэтому этот тег не следует использовать, иначе вы можете получить ответы на c ++, которые вы не сможете использовать, если вы на самом деле используете c.
  • 0
    Очень похоже на вчерашний вопрос
Теги:
string

2 ответа

3
Лучший ответ

Вы должны выделить память для своих строк. У вас есть только указатели, вам нужно сделать следующее:

char *first  = new char[100];
char *second = new char[100];
char *third  = new char[100];

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

delete [] first;
delete [] second;
delete [] third;

Обратите внимание, что new и delete из C++. Вам нужно будет включить соответствующие заголовки или использовать C-эквиваленты malloc и free.

Вы также можете использовать память из стека, с которой легче справиться (вам не нужно ее освобождать), но также и более напугать, например:

char first[100];
char second[100];
char third[100];

В основном, когда вы пытаетесь получить доступ к адресу памяти без предварительного выделения памяти, вы получаете ошибку сегментации. Это просто механизм безопасности, чтобы предотвратить (больше) ошибок. Когда вам нужна память, убедитесь, что вы либо используете память из стека, либо выделяете ее с помощью C malloc или C++ new.

И, как предложение, если вы используете C++, это не помешает взглянуть на std::string.

  • 2
    Или просто придерживайтесь более простого, более быстрого и безопасного распределения стека, выполнив char first [100], second [100], third [100].
3
char *first;
char *second;
char *third;
char *c;

printf("Enter the first string\n:");
scanf("%99s", first);
printf("Enter the second string\n:");
scanf("%99s", second);
printf("Enter the second string\n:");
scanf("%99s", third);

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню