C вопрос новичка: массив не печатает - PullRequest
0 голосов
/ 28 января 2020

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

Количество символов выглядит нормально, но не будет печатать полную строку , По какой-то причине он будет печатать только второй символ. Я просматривал свой код и до сих пор не могу понять, почему это происходит.

Если я введу: abcdef

Он выведет: 1 b 2 3 4 5 6

Вместо предполагаемого: a 1 b 2 c 3 d 4 e 5 f 6

#include <stdio.h>

int main()
{
    char c;
    char str[0] = {};
    int i;
    int charcount;

    charcount = 0;

    for (i = 0; (c = getchar()) != '@' && c != '\n'; i++) {
        c = str[i];

        charcount++;

        printf("%c %d \n", str[i], charcount);

        //if(charcount > 80)
        //  printf("%d", z[i]);
    }

    return 0;
}

Любая помощь приветствуется. Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 января 2020

У вас есть переменная str нулевой длины, и вы пытаетесь получить доступ к различным элементам в ней (но у нее нет ни одного, так что это неопределенное поведение)

Просто избавьтесь от нее и используйте c напрямую:

#include <stdio.h>

int main()
{
  char c;
  int i;
  int charcount;

  charcount = 0;

  for (i = 0; (c = getchar()) != '@' && c != '\n'; i++) {
    charcount++;
    printf("%c %d \n", c, charcount);
  }

  return 0;
}
1 голос
/ 28 января 2020

Для стартеров в соответствии со стандартом C функция main без параметров должна быть объявлена ​​как

int main( void )

Это объявление

char str[0] = {};

недопустимо в двух отношениях. Размер массива должен быть больше нуля. И фигурные скобки, которые инициализируют массив, не должны быть пустыми.

Фактически массив является избыточным, потому что вы пытаетесь просто выводить введенные символы.

Это назначение

c = str[i];

не имеет смысла, даже если массив был объявлен правильно, поскольку введенный символ перезаписывается (не существует) элементом массива.

Сама переменная c должна иметь введите int.

Если вам просто нужно выполнить это

Я пытаюсь создать простую программу, которая будет читать строку и печатать ее вместе с количеством символов

, тогда программа может выглядеть, например, следующим образом:

#include <stdio.h>

int main(void) 
{
    size_t i = 0;

    for ( int c = getchar(); c != EOF && c != '\n' && c != '@'; c = getchar() )
    {
        ++i;
        printf( "%c %zu ", c, i );
    }
    putchar( '\n' );

    return 0;
}

Если ввести

abcdef

, тогда вывод будет

a 1 b 2 c 3 d 4 e 5 f 6

Если вы хотите использовать массив символов и сохранить введенные символы в массиве, программа может выглядеть следующим образом:

#include <stdio.h>

int main(void) 
{
    enum { N = 100 };
    char s[N];
    int c;

    for ( size_t i = 0; i < N && ( c = getchar( ) ) != EOF && c != '\n' && c != '@'; i++ )
    {
        s[i] = c;
        printf( "%c %zu ", s[i], i + 1 );
    }
    putchar( '\n' );

    return 0;
}

Вывод программы будет таким же, как указано выше, если вводить для пример abcdef.

0 голосов
/ 28 января 2020

Я понял, что ваш вопрос означает, что вы хотели сохранить введенные в массив символы и распечатать их как вы go. Вы хотите дать массиву начальный размер (я выбрал 99), а затем добавить символы в массив, как вы go. Вы можете отслеживать длину, чтобы знать, где находится «конец». Есть лучшие способы управления строковыми данными в C, но здесь вы go.

#include <stdio.h>

int main()
{

  char c;
  char str[99] = {};
  int i;
  int charcount;

  charcount = 0;

  for (i = 0; (c = getchar()) != '@' && c != '\n'; i++) {
//    c = str[i];
str[i] = c;

    charcount++;

    printf("%c %d \n", str[i], charcount);

    //if(charcount > 80)
    //  printf("%d", z[i]);
  }

return 0;
}

Некоторые дополнительные мысли:

  1. Возможно, вы захотите взглянуть на что-то вроде string.h
  2. Если вы собираетесь сохранить массив char, вам нужно защитить его от превышения размера массива
  3. Добавление небольшого упоминания о том, что ожидает ваша программа, каковы требования, например, ввод, вывод и т. д. c помог бы получить лучшие ответы от сообщества
...