Я просто пытаюсь сканировать строки в массив. Что я делаю неправильно? - PullRequest
0 голосов
/ 19 марта 2020
#include <stdio.h>
#include <string.h>

int main(void) {

   const int NUM_VALS = 20;
   int i;
   int actualInput;
   char userString[actualInput][NUM_VALS];
   int matchCount = 0;

   scanf("%d", &actualInput);

   for (i = 0; i < actualInput; ++i) {
      scanf("%s", userString[i]);
      printf("%s", userString[i]);
   }



   return 0;
}

Вывод:

b'hellohi \ x80 \ x07 @ \ xd2 \ x05 @ \ x9a \ x16 [\ xea \ xccp \ xa6 \ x15 \ xf6 \ x18 + \ xbf \ x87 \ x8a # \ x14) \ x05 @ \ XFE \ x7f'b '\ x92 \ x1fk \ xb3 \ XFE \ x7f \ XFE \ x7f \ x118 \ x08 \ X Е8 \ x03 \ x0eY \ x03k \ xb3 \ XFE \ x7f \ XFE \ x7f \ xb2Y {\ xe8C} 8 \ г \ x8b-у {\ x8cx86_64'F-8sbin: / USR / местные / бен: / USR / SBIN: / USR / бен: / SBIN: / бен / USR / SBIN: / USR /bin:/sbin:/binsbin:/binTF-88tf8RELOAD=/usr/lib/x86_64-linux-gnu/coreutils/libstdbuf.so64-linux-gnu/coreutils/libstdbuf.sols/libstdbuf.soout

Я пробовал некоторые варианты, заменяя userString [i] на userString в функции scanf. Результат выводит 50 000 входов моей последней строки. Я не понимаю, что происходит.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

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

int actualInput;
char userString[actualInput][NUM_VALS];
int matchCount = 0; 

scanf("%d", &actualInput);

Первая строка объявляет переменную с именем actualInput, но не присваивает значение этой переменной.

Вторая строка объявляет массив переменной длины (VLA) , используя значение в actualInput. Использование значения неинициализированной переменной приводит к неопределенному поведению , что в основном означает, что после этой точки в коде может произойти все что угодно. Вероятно, что происходит (в зависимости от вашего описания проблемы), что actualInput - это либо ноль, либо небольшое число, поэтому вы получаете массив, слишком малый для хранения вашего ввода.

Последняя строка (с scanf) наконец присваивает значение actualInput. Возможно, вы думаете, что размер массива изменится сам при изменении actualInput. Это определенно не происходит. В C, после создания VLA, его размер не может быть изменен.

Решение простое, переставьте код так, чтобы все было выполнено в правильном порядке:

int actualInput;
scanf("%d", &actualInput);
char userString[actualInput][NUM_VALS];

int matchCount = 0;

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

int actualInput;
if (scanf("%d", &actualInput) != 1 || actualInput < 1 || actualInput > 1000)
{
    printf("That is not a valid array size\n");
    return 1;
}
char userString[actualInput][NUM_VALS];
0 голосов
/ 19 марта 2020

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

for (i = 0; i < actualInput; ++i) 
{
    gets(stri);
    for (k=0;k<strlen(stri);k++)
    userString[i][j]=stri[j];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...