#c
#c
Вопрос:
Мне нужно получить 10 слов и проверить, являются ли они панграммой (предложением, содержащим все буквы алфавита), или прекратить получать слова, если моя программа уже нашла панграмму, даже если пользователь не вставил 10 слов, и моя программа перестает получать слова после первого слова. Кто-нибудь знает почему?
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAX_NAMES 10
#define LONG 50
int main()
{
char names[MAX_NAMES][LONG] = {0};
bool flage = true;
int i = 0, j = 0, k = 0;
char allAlphabet[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int countAlfa = 0;
printf("Enter up to 10 words, try to make a pangram:n");
for(i = 0; (i < MAX_NAMES) amp;amp; (flage == true); i )
{
fgets(names[i], LONG, stdin);
names[i][strcspn(names[i], "n")] = 0;
for(j = 0; j < strlen(allAlphabet); j )
{
if(names[i][k] = allAlphabet[j])
{
countAlfa ;
k ;
j = 0;
}
}
if(countAlfa == 26)
{
printf("It's a pangram?n");
printf("Yes!n");
flage = false;
}
}
if(countAlfa != 26)
{
printf("It's a pangram?n");
printf("Non");
}
}
Комментарии:
1.
if(names[i][k] = allAlphabet[j])
Похоже, вы хотели==
бы этого.allAlphabet
не является строкой, заканчивающейся 0, поэтому использование strlen для нее не будет работать.2. Вы никогда не сбрасываете k в 0 и не прерываете цикл, когда k проходит мимо конца проверяемой строки.
countAlfa
увеличивается при каждом нахождении буквы, а не только уникальной буквы, поэтому ввод «abcde» дважды составляетcountAlfa
10, а не 5, как должно быть. Возможно, вам захочется переместить проверкуcountAlfa == 26
внутри цикла сразу после увеличенияcountAlfa
, иначе вы можете легко пройти мимо нее, и поскольку проверка==
вместо>=
нее fais.
Ответ №1:
2 проблемы
- В вашем коде были некоторые ошибки. Например,
if(names[i][k] = allAlphabet[j])
выполняет присваивание, а не проверку эквивалентности. Вы хотели использовать==
. Это приводило к путанице. - Во-вторых, я запустил ваш код, и он сработал, если я набрал «abc …. wxyz». Однако, если бы я сделал это в обратном направлении, например, «zyxw … cba», это не сработало бы.
Вот программа, которую я написал, это то, что вы ищете. Пожалуйста, обратите внимание, я не проверяю переполнение массивов символов. Я просто пытаюсь привести вам рабочий пример, и я сделал емкости массивов достаточно большими, чтобы они работали без проверки.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAX_NAMES 10
#define LONG 100
int main()
{
char names[MAX_NAMES][LONG] = { 0 };
bool flage = true;
int i = 0, j = 0, k = 0;
char allAlphabet[] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
unsigned allAlphabetLength = sizeof(allAlphabet) / sizeof(allAlphabet[0]);
int countAlfa = 0;
char buf[27]; // stores all the unique alphabetic characters found so far
// at a given point while searching through a string
buf[0] = '';
unsigned bufIndex = 0;
char result[1000];
result[0] = '';
for (unsigned i = 0; i < MAX_NAMES; i ) {
fgets(names[i], LONG, stdin); // get the current string
names[i][strcspn(names[i], "n")] = 0; // get rid of newline character
strcat(result, names[i]); // append current string to result array
unsigned len = strlen(result); // get the length of the result array
for (unsigned j = 0; j < len; j ) { // go through every character in the result array
// add it to buf if it's alphabetic and hasn't
// been encountered before
char ch = result[j]; // get the character
if (!isalpha(ch)) // not alphabetical character. Just continue to next character
continue;
unsigned bufLen = strlen(buf); // search through buf to see if the current alphabetic
// character already exists in buf. If it doesn't, add
// it to buf since we've now encountered a new alphabetic
// character not seen before
bool found = false;
for (unsigned k = 0; k < bufLen; k ) {
if (buf[k] == ch) {
found = true;
break;
}
}
if (!found) {
buf[bufIndex ] = ch;
buf[bufIndex] = '';
}
}
if (strlen(buf) == 26) { // at the end, if buf is size 26 that means it encountered all 26 letters
// of the alphabet
printf("%s is a pangramn", result);
break;
}
}
return 0;
}
Пример вывода
abcde blah blah blah
this is a sentence
fghijkl
this is another sentence
lmnopqrstuvwx
blah
yz
abcde blah blah blahthis is a sentencefghijklthis is another sentencelmnopqrstuvwxblahyz is a pangram
Комментарии:
1.
if (len < 26)
кажется неправильным. Код ожидает, что слова будут вводиться по одному в строке, поэтому все будет отклонено.===
в вашем описании одна из проблем выглядит как опечатка для==
.2. Спасибо за то
===
, что я просто случайно вставил другое=
. Я только что понял, что неправильно понял исходную проблему. Я думал, что он должен был проверять, является ли каждая строка панграммой. Я исправлю удаление моего сообщения и исправлю его.