【问题标题】:How to retrieve a portion of a string?如何检索字符串的一部分?
【发布时间】:2019-01-23 19:37:44
【问题描述】:

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

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

我也不完全确定为什么。

【问题讨论】:

  • 你没有设置字符串的最终\0
  • 什么意思?
  • @Ôrel 它被复制了。
  • char allPermissions[10]; 有足够的空间容纳 9 个字符和空终止符。由于您在 scanf 中向其中写入了 10 个字符,因此您调用 undefined behavior
  • @WeatherVane 我数了 drwx------ 中的 10 个字符- 4 个字母和 6 个破折号

标签: c string printf stdin


【解决方案1】:

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

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

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

strcpy(permissions, allPermissions + 1);

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @GovindParmar 你能澄清一下缺少什么吗? OP 问题是没有考虑到 char 字符串中的 null terminator
    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2016-10-15
    • 2022-11-10
    • 2012-07-16
    相关资源
    最近更新 更多