Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回c中第一个空格后字符串的其余部分_C - Fatal编程技术网

返回c中第一个空格后字符串的其余部分

返回c中第一个空格后字符串的其余部分,c,C,我正在编写一个程序,在第一个空格后返回字符串的剩余部分 "I had a bad day" 应该回来 "had a bad day" 这就是我目前所拥有的 char* next_word(char* str){ char s[100]; int index = 0; int i = 0; int counter = 0; for(i = 0; i < strlen(str); i++){ if(str[i] == ' '){

我正在编写一个程序,在第一个空格后返回字符串的剩余部分

"I had a bad day"
应该回来

"had a bad day"
这就是我目前所拥有的

char* next_word(char* str){
    char s[100];
    int index = 0;
    int i = 0;
    int counter = 0;
    for(i = 0; i < strlen(str); i++){
        if(str[i] == ' '){
            index = i+1;
            for(index; index < strlen(str); index++){
                s[counter] = str[index];
                counter = counter + 1;

            }
            s[index] = '\0';
            return s;

        }


    }
    return index;
}
char*下一个单词(char*str){
chars[100];
int指数=0;
int i=0;
int计数器=0;
对于(i=0;i
我在char*str中循环,找到第一个空空间的索引,然后从那里我做了另一个循环,从索引+1开始打印字符串的其余部分。由于某种原因,当我写s[counter]=str[index]时,我不相信它会将字符从str复制到s。 当我尝试在循环后返回s时,我什么都没有得到。是否可以将char添加到空char s[100],然后将完整字符串返回为s? 谢谢

您的
next_word()
函数正在返回一个局部(函数)变量,这将导致未定义的行为。您必须将
s
(在您的情况下)作为输入,或在函数中malloc字符缓冲区。然后你就可以复印了。我希望您选择第一种选择,并且不要忘记检查输入字符串的长度,以便在复制时不会交叉大小

另外,当没有找到空格时,
next_word()
返回
index
?这显然是一个错误,您的代码将无法编译


对于代码,只要找到第一个空格,就可以从第一个循环中断,然后继续复制。

不应返回
s
,因为它是堆栈上的局部变量。您可以简单地将指针返回到
str
参数中,因为
str
在返回时仍然有效

#include <string.h>

const char* TheString = "I had a bad day";

const char* stringAfterBlank(const char* str)
{
    const char* blank = strchr(str, ' ');
    if (blank != NULL)
    {
        return ++blank;
    }
    return "";
}

void main(int argc, char** argv)
{
    const char* restOfTheString = stringAfterBlank(TheString);
    // restOfTheString is "had a bad day" pointing into TheString
}
#包括
const char*TheString=“我过了糟糕的一天”;
常量字符*stringAfterBlank(常量字符*str)
{
常量字符*空白=strchr(str',);
if(空白!=NULL)
{
返回++空白;
}
返回“”;
}
void main(整型argc,字符**argv)
{
const char*restofstring=stringAfterBlank(字符串);
//剩余的字符串指向字符串“度过了糟糕的一天”
}

如果需要字符串的副本,则可以使用
strdup
。如果您这样做了,请不要忘记释放

,您不应该返回局部变量。完成所需任务的最简单方法是对指针进行操作

正如您所希望的,有一种解决方案仅使用stdio.h:

#include <stdio.h>

char* next_word(char* str);

int main()
{
    char* arg = "I had a bad day!";
    //Print every "next_word"
    char* words = arg;
    do{
        printf("%s\n", words);
    } while(words = next_word(words));
}

char* next_word(char* str)
{
   while(*str != '\0'){
       if(*str++ == ' ')
           return str;
   }
   return NULL;
}
#包括
char*下一个单词(char*str);
int main()
{
char*arg=“我今天过得很糟糕!”;
//打印每个“下一个单词”
char*words=arg;
做{
printf(“%s\n”,字);
}while(单词=下一个单词);
}
char*下一个单词(char*str)
{
而(*str!='\0'){
如果(*str++='')
返回str;
}
返回NULL;
}

next\u word()
函数返回字符*和int?你的代码正在编译吗?另外,
s
是一个局部变量。因此,返回
s
是未定义的行为。难道您没有从编译器获得任何诊断消息吗@kuro,我的代码已经编译了,我想我只返回了s,这是一个字符s@serenitynow13,那么代码中的
返回索引
语句呢?这是打字错误吗?谢谢你的解答!我尝试只使用stdio和stdlib来实现这一点。
strchr
是一个非常简单的函数,您可以轻松地用自己的代码替换它(搜索“strchr实现”)。