Код C действует необычно, откуда берутся специальные символы? - PullRequest
0 голосов
/ 26 сентября 2019

Я испытываю необычное поведение вывода при изменении диапазона массива y [].

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

int main(void) {
  char x[50];
  int y[50];
  fgets(x, 50, stdin);
  for (int i; i<50; i++){
    printf("%c", x[i]);
  }
  printf("DONE\n");
  return 0;
}

Чтобы проверить программу, я вводил '10 10 10', и я ожидаю, чтоввод должен быть распечатан программой, за которым следует оператор «DONE».

Однако код выводил «10 10 10» с помощью «?DONE' , '; DONE» или другого варианта специальных символов..

Если я закомментирую 'int y [50]', он полностью пропустит цикл for.

Исходя из фона python / swift / java, я понятия не имею, что происходит и почемумассив 'y' вызывает ошибки, когда я даже не использую его.Может быть, это просто потому, что я новичок в c, но я даже не знаю, как описать проблему (отсюда и дрянное название)

ПРИМЕЧАНИЕ * Есть точка в массиве 'y', но я удалил ее изпрограмма для простоты, пытаясь устранить проблему.

Ответы [ 3 ]

6 голосов
/ 26 сентября 2019

i неинициализирован.Чтение из неинициализированной переменной вызывает неопределенное поведение.Часто они будут заполнены произвольными данными, которые попали в стек.Установите i на 0.

. Вы также должны прекратить зацикливание, когда дойдете до конца строки.Либо остановитесь, когда вы нажмете '\0', либо выполните цикл до strlen(x).

for (int i = 0; i < 50 && x[i] != '\0'; i++)

или

int len = strlen(x);
for (int i = 0; i < len; i++)
5 голосов
/ 26 сентября 2019

Если ваша цель - ТОЛЬКО напечатать то, что снято x [], тогда измените это:

for (int i; i<50; i++){

на это:

for (int i=0; (x[i]!='\0') && (i<50); i++){
0 голосов
/ 26 сентября 2019

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

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

int main(void) {
  char x[50];
  int y[50];
  fgets(x, 50, stdin);
  for (int i; i<strlen(x); i++){
    printf("%c", x[i]);
  }
  printf("DONE\n");
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...