如何检索字符串的一部分?

How to retrieve a portion of a string?

我正在从 stdin 读取一串文件权限,我想创建另一个字符串来保存所有字符,除了用户在 stdin 中输入的字符串中的第一个字符。

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--------

而且我不完全确定为什么。

您应该在字符串末尾添加 null-terminator 个字符。因此,尽管 drwx------ 对您来说是 10 个字符,但它需要 11 个字符(包括 [=13=])才能将其存储在内存中。

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;
}

循环遍历整个字符串并将每个元素一个一个地复制到目标字符串中是可行的,但它是低效且不合常理的 C。您可以在 O(1) 中完成此操作;从 stdin 读取字符串后,只需指向字符串开头后的第一个:

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

这也适用于将字符串复制到新缓冲区等操作:

strcpy(permissions, allPermissions + 1);

请注意,大小为 10 的数组不足以读取 'drwx------' 这样的字符串,因为您还需要考虑空终止符。一般来说,我不会使用 scanf 系列函数来读取 stdinfgets 是更好的选择。