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