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

时间:2019-01-23 19:37:45

标签: c string printf stdin

我正在从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 -------

我不确定为什么。

2 个答案:

答案 0 :(得分:2)

遍历整个字符串并将每个元素一个一个地复制到目标字符串中是可行的,但是它效率低下且具有单数C语言。您可以在O(1)中完成此操作;从stdin中读取字符串后,只需在字符串开头后指向一个:

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

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

strcpy(permissions, allPermissions + 1);

请注意,数组大小为10不足以读取“ drwx ------”之类的字符串,因为您还需要考虑空终止符。通常,我不会使用scanf-family函数来读取stdinfgets是更好的选择。

答案 1 :(得分:1)

您应该在字符串的末尾添加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;
}