найти ошибку в некоторых случаях этого указателя символа? - PullRequest
0 голосов
/ 07 апреля 2020

Мы должны вывести новую строку для каждого пробела / пробела между строками. Это хорошо работает, за исключением некоторых тестовых случаев. (Диапазон длины строки составляет от 0 до 1000).

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

int main() {

  char *s, length, i;
  s = malloc(1024 * sizeof(char));
  scanf("%[^\n]", s);
  s = realloc(s, strlen(s) + 1);
  // Write your logic to print the tokens of the sentence here.
  length = strlen(s);

  for (i = length - 1; i >= 0; i--) {
    if (*(s + i) == ' ')
      *(s + i) = '\n';
  }

  for (i = 0; i <= length - 1; i++) {
    printf("%c", *(s + i));
  }
  return 0;
}

this тест случай


isaegb spqe soslux фев zpkqvly jfavnxk bkyb AKX c zxknsau WWS hojqcxw VH vioxmqp c у vlgvzdv кг uqoddl cvjvo xkglami bnny whqnfyl гТП qfqr gezclci lwboj ПГЗ refjok LSJ qnswwvk v YV knacos ttjf ngb bobcezv tus ijgv ak dtylnij sbba wo lwojx pmxrwt fspq hao dp tnlw nmbqe ynf h rkbucw bddth v qxce ithzul if xw tzbsqq qx m ujf czkylju rhhjt zhvjt rhvjt rhvd hupb BTE Ауза lsmd aeou vrlp imxy bixzt xob arjgp arxsl pulrt М.Ф. к vtwbi хх ут wqlz вечера vragv aptjle siqvy rifmztd wxytzs ukqqrxm RFR вес aipunhj omwr мг J XeI мы план мероприятий по связи вмс в европе Ьу е efgsun САК vdstjb gkxporp ziwmbj сут nltxhk hqil ygxmw eodsp EWR femlf у кВт hmber uvfttlv vwmtmgv gohkvu syrp yayndiw qnshe gdofdyi ziszbk gb qh mrepw t hrisl lwgej wjwl b jvycei этфxfa ft fbdyjki pdjntfi odkyqi suu ozqgiz e ryjw ekkbwvt i yqqoql w ch poco dqlfyri vltaoyt fsetj ksw jtvddy qmhs ciw qkae h zhyjhghhhhhhhhhhhhh

Ответы [ 3 ]

2 голосов
/ 07 апреля 2020

Есть несколько недостатков.

Первый - неправильное объявление переменных length и i, которые объявлены как имеющие тип char.

char *s, length, i;

Они не могут хранить значение выше 127 или 255 в зависимости от того, ведет ли тип char к типу signed char или unsigned char.

Они должны быть объявлены как имеющие тип size_t - возвращаемый тип функции strlen

Фактически вызов этой функции является избыточным. Вы можете положиться на конечный ноль входной строки.

Нет необходимости динамически выделять и перераспределять массив. Вы можете объявить массив с автоматическим c сроком хранения.

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

Обратите внимание на то, что вывод подстрок строки означает изменение самой строки.

Вот демонстрационная программа, которая показывает, как задача может

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

int main(void) 
{
    enum { N = 1001 };

    char s[N] = "";

    fgets( s, sizeof( s ), stdin );

    const char *delim  = " \t\n";

    for ( const char *p = s; *p; )
    {
        p += strspn( p, delim );

        int n = strcspn( p, delim );

        if ( n ) printf( "%*.*s\n", n, n, p );

        p += n;
    }

    return 0;
}

Если ввести, например, следующую строку " Hello Gautam Goyal", то вывод программы будет

Hello
Gautam
Goyal
2 голосов
/ 07 апреля 2020

Вы объявили i и length как char, что не может представлять числа выше 127. Они будут переполнены значениями, превышающими эти. Сделайте их short или int например.

0 голосов
/ 07 апреля 2020

только для справки: вы можете использовать функцию isspace() в ctype.h. Он читает пробельные символы, такие как '\ n', '\ t', '' и т. Д .; и возвращает истинное значение при обнаружении любого из них.

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