一个函数名称切片,它接受字符串输入并返回切片字符串(如从 3 到 6)

a function name slice which takes a string input and return the sliced string (like from 3 to 6)

提问人:sarthak jain 提问时间:11/16/2023 更新时间:11/16/2023 访问量:31

问:

#include <stdio.h>

void slice(char user_input[]);

int main(){
    char user_input[100];
    scanf("%s", user_input);

    slice(user_input);
}

void slice(char user_input[]){
    char result[3];
    int n = 3, m = 6;
    int x = 0;

    for (int i = 0; user_input[i] != '\0'; i++)
    {
        if (i >= 3 && i <= 6)
        {
            result[x] = user_input[i];
           x++;
       }
    
    }
    puts(result);   
}

尝试将结果数组的长度更改为 100 或 50,然后查看输出,我没有得到它为什么显示一些奇怪的输出

数组 C 切片

评论

1赞 Jabberwocky 11/16/2023
您忘记将 null 终止符放入切片字符串中,并且数组不够大。result

答:

1赞 Jabberwocky 11/16/2023 #1

您看到的错误/奇怪的输出是由于未定义的行为造成的,因为数组中没有空终止符和/或数组不够长。resultresult

你想要这个:

void slice(char user_input[]) {
  char result[30];    // provide more space
  int n = 3, m = 6;
  int x = 0;

  for (int i = 0; user_input[i] != '\0'; i++)
  {
    if (i >= 3 && i <= 6)
    {
      result[x] = user_input[i];
      x++;
    }
  }

  result[x] = '\0';   // put the null terminator
  puts(result);
}

解释在评论中。


但无论如何,这过于复杂且效率低下。

这更好、更简单:

...
#include <string.h>  // neded for strcpy
...

void slice(char user_input[]) {
  char result[30];
  int n = 3, m = 6;
  
  strcpy(result, user_input + n, m - n);

  puts(result);
}

如果出于某种原因(锻炼等)不允许用户,则应编写自己的函数,这也是 1-2 行代码。strcpystrcpy

请注意,此代码中根本没有验证,缓冲区可能仍然太小,具体取决于 和 的值。resultnm


免責聲明

整体设计还是很差的。

  • 该函数应具有 和 作为参数。slicemn
  • 如果您打算修改为(作为您的标题“...并返回切片字符串“建议,如果您天真地在末尾添加 a,这将不起作用,因为返回局部变量的地址最终会失败,stackoverflow.com 上有很多重复项)。void slicechar *slicereturn result;
  • 以及其他一些细节,如缺少参数验证等。

评论

0赞 sarthak jain 11/16/2023
是的,我知道代码很复杂且设计不佳。我有一个习惯,首先是按照简单的方式去做,因为它使我很容易获得正确的方法来做到这一点,避免混淆,然后我试图让它越来越有效,再次感谢深入并解释我的代码😊的优缺点
0赞 sarthak jain 11/16/2023
请解释您如何使用它,以及为什么以及为什么使用多个参数 strcpy(result, user_input + n, m - n);
0赞 Jabberwocky 11/16/2023
@sarthakjain我没有收到你的最新评论。你读过的文档吗?这是一个非常基本的功能。你读过 C 教科书中关于字符串的章节吗?strcpy