/ / Infinite Loop podczas liczenia z tablicą [C] - c

Infinite Loop przy liczeniu z tablicą [C] - c

Próbowałem ostatnio wrócić do C (w celach związanych z pracą) i byłem na warsztacie odświeżającym C. Nie mogę się zastanowić, dlaczego w tym kodzie występuje nieskończona pętla.

Próbuję napisać kod programu, który zwraca liczbę słów w tablicy znaków. Każda pomoc byłaby bardzo mile widziana. Dzięki!

// ArrayWords.c
#include <stdio.h>
#include <ctype.h>
#define LENGTH 50

int word_count(char []);

int main(void) {

char sentence[LENGTH];
int i;

printf("Enter a sentence with at most %d characters:n", LENGTH);

for(i = 0; i < LENGTH; i++)
scanf("%s", &sentence[i]);

printf("Sentence = %sn", sentence);

printf("Word count = %dn", word_count(sentence));

return 0;
}

// Count the number of words in str
int word_count(char str[]) {

int i, word = 1;

for(i = 0; i < LENGTH; i++)
while(str[i] != "")
if((isspace(str[i])))
{
word++;
}

return word;
}

Odpowiedzi:

1 dla odpowiedzi № 1
  • Twoje użycie scanf nie jest dobrze.
  • word_count powodują nieskończoną pętlę, ponieważ i nie jest aktualizowany w while pętla.

poprawiony kod:

// ArrayWords.c
#include <stdio.h>
#include <ctype.h>
#define LENGTH 50

int word_count(char []);

int main(void) {

char sentence[LENGTH];

printf("Enter a sentence with at most %d characters:n", LENGTH);

fgets(sentence, sizeof(sentence), stdin);

printf("Sentence = %sn", sentence);

printf("Word count = %dn", word_count(sentence));

return 0;
}

// Count the number of words in str
int word_count(char str[]) {

int i = 0, word = 1;

while(str[i] != "") {
if((isspace(str[i])))
{
word++;
}
i++;
}

return word;
}

0 dla odpowiedzi nr 2
for(i = 0; i < LENGTH; i++)
scanf("%s", &sentence[i]);

Tutaj czytasz char jeden po drugim. tak powinno być %c, lubić scanf(" %c", &sentence[i]);

Nie będzie to jednak właściwy sposób na odczytanie ciągu. Ponieważ nie będzie to położyć na końcu.

Ponieważ ciąg do odczytania będzie zawierał spacje, najlepszym sposobem na to byłoby fgets()

W Twojej pętli zliczania występuje również błąd, możesz zmienić ją na jedną z powyższych odpowiedzi lub po prostu użyć jednej for pętla, jak ta

for(i = 0; i < LENGTH && str[i] != ""; i++)
if((isspace(str[i])))
{
word++;
}

0 dla odpowiedzi № 3

W twoim kodziei faktycznie nie jest w pętli. Poza tym tablica zawiera zdanie z na końcu, więc jeśli długość zdania wynosi 50, spacja musi wynosić 51, ponieważ na końcu znajduje się znak ,i scanf nie jest tak dobra, jak ocenia " "jako znak stopugets nie mogę się zatrzymać, dopóki klawisz Enter nie spowoduje przepełnienia, więc używam fgets.

#include <stdio.h>
#include <ctype.h>
#define LENGTH 50
int word_count(char []);
int main(void) {
char sentence[LENGTH+1];
printf("Enter a sentence with at most %d characters:n", LENGTH);
fgets(sentence, sizeof(sentence), stdin);
printf("Sentence = %sn", sentence);
printf("Word count = %dn", word_count(sentence));
return 0;
}

// Count the number of words in str
int word_count(char str[]) {
char* p=str;
int word=0;
while(*p!=""){
if((isspace(*p))) word++;
p++;
}
return word;
}

0 dla odpowiedzi nr 4

Powinieneś czytać dane ze standardowego wejścia, nie scanf, ale znika lub dostaje! Może fgets (zdanie, LENGTH, stdin) są dobre. A w funkcji word_count możesz zastąpić if z.


0 dla odpowiedzi № 5

Ta część programu

for(i = 0; i < LENGTH; i++)
scanf("%s", &sentence[i]);

nie ma sensu. Próbuje wejść LENGTH liczba słów w pętli.

Myślę, że masz na myśli specyfikator formatu %c zamiast %s

    scanf("%c", &sentence[i]);

ale nawet w tym przypadku ten fragment kodu jest nieprawidłowy, ponieważ użytkownik może wprowadzić mniej niż LENGTH znaków lub nawet więcej niż LENGTH znaki i tablica znaków sentence nie będzie zakończony zerem.

Lepiej jest użyć funkcji standardowej fgets zamiast scanf w tej sytuacji.

I funkcja word_count jest również źle. Na przykład jeśli str byłby zakończony zerem, jednak zewnętrznyPętla for spróbuje policzyć słowa poza ciągiem. A funkcja faktycznie liczy liczbę spacji. To nie to samo, co liczba słów. Łańcuch może zawierać spacje adjasted. Ten błąd popełniają wszyscy inni w swoich odpowiedziach :) A wewnątrz zmiennej i pętla while nie jest zwiększana. Jest to więc nieskończona pętla.

int word_count(char str[]) {

int i, word = 1;

for(i = 0; i < LENGTH; i++)
while(str[i] != "")
if((isspace(str[i])))
{
word++;
}

return word;
}

Program może wyglądać w następujący sposób

// ArrayWords.c
#include <stdio.h>
#include <ctype.h>

#define LENGTH 50

size_t word_count( const char[] );

int main( void )
{
char sentence[LENGTH];

printf( "Enter a sentence with at most %d characters: ", LENGTH );
fgets( sentence, LENGTH, stdin );

printf( "Sentence = "%s"n", sentence );

printf( "Word count = %zun", word_count( sentence ) );

return 0;
}

// Count the number of words in str
size_t word_count( const char s[] )
{
size_t words = 0;

while ( *s != "" )
{
//  skip white spaces
while ( isspace( ( unsigned char )*s ) ) ++s;

if ( *s != "" ) ++words;

//  skip the word
while ( *s != "" && !isspace( ( unsigned char )*s ) ) ++s;
}

return words;
}

Jego wyjście może wyglądać

Enter a sentence with at most 50 characters: Hello, Unholy Wish
Sentence = "Hello, Unholy Wish"
Word count = 3

-1 dla odpowiedzi № 6

To nie jest nieskończona pętla.

Twój program próbuje odczytać 50 (lub LENGTH) słowa (i zapisywanie ich jeden na drugim).

    for(i = 0; i < LENGTH; i++)
scanf("%s", &sentence[i]);

Umieść pierwsze słowo od sentence[0]; wstaw drugie słowo od sentence[1] nadpisywanie znaków z pierwszego słowa; ...