2016-09-19 74 views
1

我对C非常陌生,我应该创建strtok函数。问题是,我不断收到分段错误在此代码:通过字符串迭代C中的分段错误

char *newstring = "testing, testing, tested." 
while(*newstring != '\0'){ 
    /*replace delimiters with nulls*/ 
    printf("STARTING ITERATION\n"); 
    if(*newstring ==','){ 
     *newstring='\0'; 
    } 

    printf("newstring char in loop: %c\n", *newstring); 
    /*printf("delimiters char in loop: %c\n", *delimiters);*/ 
    newstring++; 
    printf("END OF ITERATION\n"); 
} 
printf("OUT OF ITERATION"); 

输出是这样的:

STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: e 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: s 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: e 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: s 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: t 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: e 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: s 
END OF ITERATION 
STARTING ITERATION 
newstring char in loop: . 
END OF ITERATION 
Segmentation fault (core dumped) 

所以,它看起来像它会一路走过来的字符串的结束和循环的最后一步,但实际上并没有使它退出循环。我不知道我错过了什么。

+2

你正在修改字符串字面..这是未定义的行为。试试'char newstring [] =“测试,测试,测试。”;'而是。 – yano

+0

指针不是数组。您的代码调用未定义的行为。您尝试修改_string literal_。 – Olaf

+0

你知道Literal String是什么吗? – Michi

回答

3

您正在尝试修改C中不允许的字符串文字。如果将char *newstring = "testing, testing, tested."更改为char newstring[] = "testing, testing, tested.",那么您正在修改数组的内容。

+1

在C++它不会编译。 – Olaf

+0

事情是,对于这个代码片段存在的函数,输入字符串作为字符串文字参数进来。所以我需要找到一种方法将文字复制到一个数组中,并且我不允许使用字符串库函数。 我很乐意接受这方面的建议。 – ChasetopherB

+0

@ChasetopherB遍历字符串以获得它的长度。分配内存'char * modStr = malloc(strLen + 1)'。并用'memcpy'复制字符串内容。 – Nikita