此代码查找字符串中的下一个单词。
例如
在输入" 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;
}
答案 0 :(得分:2)
char* result[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;
}
答案 1 :(得分:1)
以下行在堆栈中分配内存空间,但是在函数结束后,所有内容都消失了:
char result[1000];
您需要像这样在堆中分配内存:
char *result = malloc(sizeof(char) *1000);
注意:不要忘记通过free
函数释放该内存空间。