Как напечатать длину каждого слова в строке перед каждым словом - PullRequest
0 голосов
/ 31 марта 2019

Я хочу напечатать длину каждого слова в строке.

Я пытался, но не получил правильный ответ.После запуска кода он напечатает длину каждого слова после слова вместо печати перед каждым словом.

char str[20] = "I Love India";

int i, n, count = 0;
n = strlen(str);

for (i = 0; i <= n; i++) {
    if (str[i] == ' ' || str[i] == '\0') {
        printf("%d", count);
        count = 0;
    } else {
        printf("%c", str[i]);
        count++;
    }
}

I, за исключением того, что вывод равен 1I 4Love 5India, но фактический вывод равен I1 Love4 India5.

Ответы [ 4 ]

1 голос
/ 31 марта 2019

Вы хотите вычислить и напечатать длину каждого слова, прежде чем печатать слово.

Вот простое решение с использованием strcspn(), стандартной функции, которую следует использовать чаще:

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

int main() {
    char str[20] = "I Love India";
    char *p;
    int n;

    for (p = str; *p;) {
        if (*p == ' ') {
            putchar(*p++);
        } else {
            n = strcspn(p, " ");  // compute the length of the word
            printf("%d%.*s", n, n, p);
            p += n;
        }
    }
    printf("\n");
    return 0;
}
1 голос
/ 31 марта 2019

Вы можете использовать strtok как Некоторые программисты чувак sugested.Вы можете сделать копию оригинальной строки, так как strtok изменяет переданную строку.Кроме того, strtok не является поточно-ориентированным и должен быть заменен на strtok_r при работе с многопоточными программами.

#include <stdio.h>
#include <stdlib.h>

/* for strtok */
#include <string.h>

int main() {
    char str[20] = "I Love India";
    int n;

    char* tok = strtok(str, " ");

    while (tok != NULL) {
        n = strlen(tok);
        printf("%d%s ", n, tok);
        tok = strtok(NULL, " ");
    }

    return EXIT_SUCCESS;
}
0 голосов
/ 31 марта 2019

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

Это может быть что-то вроде:

int main(void) 
{
    char str[20]="I Love India";
    size_t i = 0;
    while(str[i])
    {
        if (str[i] == ' ')   // consider using the isspace function instead
        {
            // Print the space
            printf(" ");
            ++i;
        }
        else
        {
            size_t j = i;
            size_t count = 0;

            // Calculate word len
            while(str[j] && str[j] != ' ')
            {
                ++count;
                ++j;
            }

            // Print word len
            printf("%zu", count);

            // Print word
            while(i<j)
            {
                printf("%c", str[i]);
                ++i;
            }
        }
    }
}

Основная идея состоит в том, чтобы иметь две индексные переменные для строки, i и j. Индекс i - это первый символ слова, а индекс j используется для нахождения конца слова. Как только конец слова найден, можно напечатать длину и слово.

0 голосов
/ 31 марта 2019

Это то, что вы хотите:

#include <stdio.h>
#include <string.h>
int main()
{
   char str[20]="I Love India";
   char buf[20];
   int i,n,count=0;
   n=strlen(str);

   for (i=0; i <= n; i++) {
       if(str[i]==' ' || str[i]=='\0'){
           buf[count] = '\0';
           printf("%d", count); /* Print the size of the last word */
           printf("%s", buf);  /* Print the buffer */
           memset(buf, 0, sizeof(buf)); /* Clear the buffer */
           count = 0;
       } else {
           buf[count] = str[i];
           count++;

       }
   }
   return 0;
}

Вы захотите сохранить буфер слова, которое в данный момент считается. ( ЬиЕ ) Увеличение count каждый раз, когда это не пробел или 0 /. Затем, когда это пробел или 0 /, сначала выведите count , затем buf . Затем мы очистим buf и установим count в 0, чтобы переменная i продолжала увеличиваться по всей строке str , но мы вставляем слова в buf начиная с 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...