Написание программы, которая запрашивает ввод пользователя из 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;
}
Вы должны выделить память для своих строк. У вас есть только указатели, вам нужно сделать следующее:
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
.
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);
Вы никогда не выделяли память для строк. Все ваши указатели указывают на некоторые случайные адреса памяти, поэтому писать для них не определено поведение.