提问人:sarthak jain 提问时间:11/16/2023 更新时间:11/16/2023 访问量:29
一个函数名称切片,它接受字符串输入并返回切片字符串(如从 3 到 6)
a function name slice which takes a string input and return the sliced string (like from 3 to 6)
问:
#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,然后查看输出我没有得到它为什么它显示一些奇怪的输出
答:
1赞
Jabberwocky
11/16/2023
#1
您看到的错误/奇怪的输出是由于未定义的行为造成的,因为数组中没有空终止符和/或数组不够长。result
result
你想要这个:
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 行代码。strcpy
strcpy
请注意,此代码中根本没有验证,缓冲区可能仍然太小,具体取决于 和 的值。result
n
m
免責聲明
整体设计还是很差的。
- 该函数应具有 和 作为参数。
slice
m
n
- 如果您打算修改为(作为您的标题“...并返回切片字符串“建议,如果您天真地在末尾添加 a,这将不起作用,因为返回局部变量的地址最终会失败,stackoverflow.com 上有很多重复项)。
void slice
char *slice
return 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
评论
result