C字符串打印超出范围

C字符串打印超出范围,c,C,只要在主字符串stringone中找到子字符串aaa,该代码就会将其打断。这段代码正在这样做,但它正在打印出边界,并且不会在空字符处停止 我得到的结果是 谁在乎 还有一盏灯熄灭了 在一百万的天空中 星星, 如果明星是你,我会的 ; 您应该使用strtok函数。请参见示例: #include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char stringone[200] =

只要在主字符串stringone中找到子字符串aaa,该代码就会将其打断。这段代码正在这样做,但它正在打印出边界,并且不会在空字符处停止

我得到的结果是

谁在乎
还有一盏灯熄灭了
在一百万的天空中
星星,
如果明星是你,我会的

; 您应该使用strtok函数。请参见示例:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main() {
    char stringone[200] = "who cares if aaa one more light goes out aaa in the sky of a million aaa stars, aaa well i do if the star is you";
    char breaker[10] = "aaa";
    char *token = strtok(stringone, breaker);

    while (token != NULL) {
        printf("\n %s", token);
        token = strtok(NULL, breaker);
    }
    return 0;
}
#包括
#包括
#包括
int main(){
char stringone[200]=“谁在乎aaa是否还有一盏灯熄灭aaa在一百万颗aaa星星的天空中,aaa如果星星是你,我会的”;
字符断路器[10]=“aaa”;
char*token=strtok(stringone,breaker);
while(令牌!=NULL){
printf(“\n%s”,令牌);
令牌=strtok(空,断路器);
}
返回0;
}

条件
stringone!=STRSTRSTR(stringone,breaker)
仅当字符串
breaker
位于
stringone
的开头时才会失败。只要存在匹配项,代码就会按预期打印字符,但当不再存在匹配项时,
strstrstr
返回
NULL
an,即使在
stringone
结束后,条件仍会继续计算为true

代码具有未定义的行为:它打印不可预测的字符,最终会在某个点崩溃,因为continue
while(stringone)
不太可能失败

以下是修复代码的方法:

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *stringone = "who cares if aaa one more light goes out aaa "
                            "in the sky of a million aaa stars, aaa well i"
                            " do if the star is you \0";
    const char *breaker = "aaa";
    const char *p;

    while ((p = strstr(stringone, breaker)) != NULL) {
        /* print the substring before the breaker */
        printf("%.*s\n", (int)(p - stringone), stringone);
        /* skip the breaker */
        stringone = p + strlen(breaker);
    }
    /* no separator left: print the rest of the string */
    printf("%s\n", stringone);
    return 0;
}
#包括
#包括
内部主(空){
const char*stringone=“谁在乎aaa是否还有一盏灯熄灭aaa”
“在一百万颗aaa级星星的天空中,aaa级的我”
“如果星星是你,请执行\0”;
const char*breaker=“aaa”;
常量字符*p;
while((p=strstrstr(stringone,breaker))!=NULL){
/*在断路器之前打印子字符串*/
printf(“%s\n”,(int)(p-stringone),stringone);
/*跳过断路器*/
stringone=p+strlen(断路器);
}
/*没有分隔符:打印字符串的其余部分*/
printf(“%s\n”,stringone);
返回0;
}

您需要从第二个单词“cares”开始并调试代码。
stringone
永远不会变为空。
stringone==NULL
应该完成什么?如果要检查是否已到达NUL终止符,是否应该检查
char
而不是
char*
?只需读取字符串的结尾。我想你是想写
&&*stringone
而不是
|stringone==NULL
,但即使在这种情况下,你也不需要做
stringone=stringone+strlen(breaker)+1
你不需要在字符串文本的末尾添加一个明确的空字节。它是字符串文字,意味着它是为您添加的。此外,空指针常量
null
不是空字节
'\0'
@Toqoz
*stringone!=NULL是指针和整数之间的比较。
strtok()
不是这样工作的
strtok()
不能通过使用字符串作为分隔符来拆分字符串。有人投票了?!?!这个答案是错误的“对strtok()的一系列调用将s指向的字符串分解为一系列令牌,每个令牌由sep指向的字符串的一个字节分隔。”根据此答案使用
strtok()
将在每个
'A'
字符上分解字符串,而不是在任何
“aaa”
字符串上分解字符串。它可以工作。只有考虑到在所有<代码> 'As/Engult>上断开字符串时,字符才与在所有<代码>“AAA”< /Cord>字符串中断开字符串相同。这是一个非常糟糕的“作品”定义。但它打破了所有的“aaa”字串。你测试过我写的代码了吗?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main() {
    char stringone[200] = "who cares if aaa one more light goes out aaa in the sky of a million aaa stars, aaa well i do if the star is you";
    char breaker[10] = "aaa";
    char *token = strtok(stringone, breaker);

    while (token != NULL) {
        printf("\n %s", token);
        token = strtok(NULL, breaker);
    }
    return 0;
}
#include <stdio.h>
#include <string.h>

int main(void) {
    const char *stringone = "who cares if aaa one more light goes out aaa "
                            "in the sky of a million aaa stars, aaa well i"
                            " do if the star is you \0";
    const char *breaker = "aaa";
    const char *p;

    while ((p = strstr(stringone, breaker)) != NULL) {
        /* print the substring before the breaker */
        printf("%.*s\n", (int)(p - stringone), stringone);
        /* skip the breaker */
        stringone = p + strlen(breaker);
    }
    /* no separator left: print the rest of the string */
    printf("%s\n", stringone);
    return 0;
}