C字符串正在打印出界限

时间:2017-10-05 09:06:59

标签: c

当代码中找到子字符串aaa时,此代码会中断主字符串stringone。这段代码正在这样做,但它打印出界限而不是停在空字符处。

我得到的输出是这个

who cares if 
one more light goes out 
in the sky of a million 
stars, 
well i do if the star is you 
;<@����P����p���Xz��������p���0zRx
                                            ����+zRx
                                                              �$����FJ
                                                                           �?;*}D���� \�����A�C
  D|���eB�B�E �B(�H0�H8�M@r8A0A(B BB�8����p

我不明白为什么,我是否在我更新字符串的行中跳过NULL字符?

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

int main()
{

    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";

    char *breaker = "aaa";

    while(stringone)
    {
        while(stringone != strstr(stringone, breaker) || stringone == NULL)
        {
            printf("%c",*stringone);
            stringone++;
        }

        stringone = stringone + strlen(breaker) + 1;
        printf("\n");
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

你应该使用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;
}

答案 1 :(得分:0)

仅当字符stringone != strstr(stringone, breaker)位于breaker的开头时,条件stringone才会失败。只要匹配,代码就会按预期打印字符,但是当不再匹配时,strstr会返回NULL,条件会继续评估为true,甚至超过{ {1}}。

代码具有未定义的行为:它会打印不可预测的字符,并最终会在某些时候崩溃,因为continue stringone不太可能会失败。

以下是修复代码的方法:

while (stringone)