Вычислить процент слов, начинающихся с некоторой, введенной с клавиатуры буквы - C (СИ)
Формулировка задачи:
2.Дан текстовый файл, каждая строка которого представляет собой некоторую последовательность слов, вычисляет процент слов, начинающихся с некоторой, введенной с клавиатуры буквы.
Вот код: Проблема в следующем: При дебаге считает количество слов в предложении(a) на одну меньше,чем имеется) и выдает следующую ошибку: Run-Time Check Failure #2 - Stack around the variable 'buf' was corrupted.
#include "stdafx.h"
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include <string.h>
#include <ctype.h>
int _tmain(int argc, _TCHAR* argv[])
{
char buf[500];
char cpy[500];
char c, *ptr1, *ptr2;
int flag = 0;
int i,a,b,j;
float rezultat;
FILE *fp;
if ((fp=fopen("dann.txt","r"))==NULL)
{
perror("dann.txt");
return 1;
}
for (i=0; i<strlen(buf); i++)
{fscanf (fp, "%c", &buf[i]);}
printf("Enter some symbol: ");
scanf("%c", &c);
strcpy(cpy, buf);
ptr1 = strtok(cpy, " ,.");
while (ptr1) {
if (ptr2 = strchr(ptr1, tolower(c))) {
flag ++ ;
puts(ptr1);
}
else if (ptr2 = strchr(ptr1, toupper(c))) {
flag ++;
puts(ptr1);
}
ptr1 = strtok(NULL, " ,.");
}
printf("kolitchestvo slov s dannim simvolom = %d",flag);
if (!flag)
printf("No words starting with '%c' found in string:\n\"%s\"\n", c, buf);
j=0;
b=0;
a=0;
i=0;
if((buf[0]!=' ')&&(buf[0]!='.'))a=1;
while(buf[i]!='.')
{if(buf[i]==' '&&buf[i+1]!=' '&&buf[i+1]!='.')a++;
i++;}
rezultat=100*flag/a;
printf("\n Kolichestvo slov v predlozhenii —> %d \n ",a);
printf("\n Protchent slov s zadannoi bukvoi v predlozhenii —> %f \n ",rezultat);
system ("pause");
return 0;
}Решение задачи: «Вычислить процент слов, начинающихся с некоторой, введенной с клавиатуры буквы»
textual
Листинг программы
while(buf[i]!='.')
{if(buf[i]==' '&&buf[i+1]!=' '&&buf[i+1]!='.')a++;
i++;}
Объяснение кода листинга программы
В данном коде выполняется следующая последовательность действий:
- Переменная
bufсодержит строку, введенную пользователем. - Переменная
iинициализируется значением 0. - В цикле while с условием buf[i]!='.' происходит проход по всем символам строки до тех пор, пока не будет найден символ точки.
- Внутри цикла проверяется условие buf[i]==' '&&buf[i+1]!=' '&&buf[i+1]!='.'
- Если условие выполняется, то переменной
aприсваивается значение 1. - Если условие не выполняется, то происходит переход к следующему символу строки с помощью оператора i++.
- Если условие выполняется, то переменной
- После выхода из цикла while, значение переменной
aбудет содержать количество слов в строке, начинающихся с введенной буквы. - Для получения процента слов, начинающихся с введенной буквы, переменной
aделится на длину строки и умножается на 100.