c - 为什么这个函数返回null?
问题描述
此代码查找字符串中的下一个单词。
例如
给定函数的输入" my cake"
应该返回"my cake"
。作为预期输出
如果我使用return
,则输出为(null),但我使用printf
然后代码有效
我想知道如何使用 return 获得预期的输出。
#include <stdio.h>
int main()
{
char* str[1000];
printf("enter:");
fgets(str,1000,stdin);
printf("%s",find_word_start(str));
}
char* find_word_start(char* str){
char* result[1000];
int c = 0, d = 0;
while(str[c] ==' ') {
c++;
}
while(str[c] != '\0'){
result[d++] = str[c++];
if(str[c]==' ') {
result[d++] = str[c++];
}
while(str[c]==' ') { //
c++;
}
}
result[d] = '\0';
//print or return char?
return result;
}
解决方案
char* result[1000];
创建一个包含 1000 个指针的数组。这在很多方面都是错误的。
- 你想要一个 1000 个字符的块,而不是指针。
- 实际上,1000 不是您想要的字符数。您通常需要较小的数字,但也可能需要较大的数字。
- 您不想将结果存储在自动分配的内存中,因为一旦您退出该函数,它就会被释放。使用(或类似的
malloc
东西)。malloc
strdup
使固定:
// Returns a copy that needs to be freed.
char* find_word_start(const char* src) {
while (*src == ' ')
++src;
size_t len = 0;
while (str[len] != '\0')
++len;
++len; // Include NUL
result = malloc(len);
char* dst = result;
while (len--)
*(dst++) = *(src++);
return result;
}
好吧,我像你一样避免使用上面的字符串函数,但它们大大简化了解决方案。
// Returns a copy that needs to be freed.
char* find_word_start(const char* src) {
while (*src == ' ')
++src;
return strdup(src);
}
也就是说,由于您返回字符串的尾部,您可以简单地返回一个指向现有字符串的指针。
// Returns a pointer into the provided string.
const char* find_word_start(const char* str) {
while (*str == ' ')
++str;
return str;
}
推荐阅读
- caching - ServiceStack 是否缓存内部请求?
- android - 在 PlayStore 中私有分发 Android 应用程序
- php - PHP/Laravel - 管理员能够查看用户表并编辑信息
- laravel - Laravel Nova - 资源页面的 Point Nova 路径
- python - Python 未被识别为命令
- c# - 将文件从 ListBox 中的路径复制到特定文件夹
- python-2.7 - 维度问题线性回归 Python scikit 学习
- javascript - 通过按下 CSS 中的按钮向下滚动
- c++ - C ++中的指针和引用之间是否存在任何开销差异
- xcode - 在 Xcode 10 中打开现有项目;源代码控制不起作用?