Как получить часть строки? - PullRequest
0 голосов
/ 23 января 2019

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

int main(){
  char allPermissions[10];
  char permissions[9];

  scanf("%s", allPermissions);


  for(int i = 1; i <= 9; i++) {
    char temp = allPermissions[i];
    //printf("%c", temp);
    permissions[i-1] = temp;
  }
  printf("%s\n", permissions);

  return 0;
}

Есливводимые пользователем данные: drwx ------

Затем я ожидаю, что программа выдаст: rwx ------

Но я получаю: rwx ------drwx -------

И я не совсем уверен, почему.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Цикл по всей строке и копирование каждого элемента по одному в целевую строку работает, но это неэффективно и недиоматично C. Вы можете сделать это в O (1);после чтения строки из stdin, просто укажите один после начала строки:

printf("%s\n", allPermissions + 1);

Это также будет работать для таких операций, как копирование строки в новый буфер:

strcpy(permissions, allPermissions + 1);

Обратите внимание, что размер массива 10 недостаточен для чтения строки, подобной 'drwx ------', так как вам также необходимо учитывать нулевой терминатор.В общем, я бы не использовал scanf -семейные функции для чтения из stdin;fgets - лучший выбор.

0 голосов
/ 23 января 2019

Вы должны добавить символ null-terminator в конец строки символов.Таким образом, хотя drwx------ для вас 10 символов, для его сохранения в памяти потребуется 11 символов (включая \0).

int main(){
  char allPermissions[11];
  char permissions[10];

  scanf("%s", allPermissions);

  for(int i = 1; i <= 10; i++) {
    char temp = allPermissions[i];
    //printf("%c", temp);
    permissions[i-1] = temp;
  }
  printf("%s\n", permissions);

  return 0;
}
...