我正在尝试附加一个带有特定字符的字符串。我从我认为的中得到一个段错误,因为我试图附加到内存地址,我不知道我将如何改变它。
这是我调试时显示的错误,
打印: 6
要附加的词:Z H E
分段故障(核心转储(
这是与段错误对应的代码
void append(char* s, char c){
printf("print: 5n");
int len = strlen(s);
printf("print: 6n");
printf("word to be appended: %sn", s);
s[len] = c;
printf("print: 7n");
s[len+1] = ' ';
}
这是对上述函数的调用,位于这组代码的底部,带有相应的变量初始化
int x;
char *tempLine = NULL;
char *token = NULL;
char *punctuationChar;
size_t length = 0;
int charCount = 0;
char *word;
int i;
int p;
int check = 0;
struct node *curr = NULL;
struct node *newNode = NULL;
(*head) = malloc(sizeof(struct node));
curr = (*head);
rewind(stream);
for(x = 0; x < size; x++){
getline(&tempLine, &length, stream);
token = strtok(tempLine, " ");
if(x == 0){
charCount = strlen(token);
curr -> word = malloc(charCount *(sizeof (char)) + 1);
strcpy(curr -> word, token);
token = strtok(NULL, " ");
}else{
while(token != "n"){
check = 0;
printf("token: %sn", token);
charCount = strlen(token);
printf("print: 1n");
//check for punctuation aka, last word on line
for(i = 0; i < charCount; i++){
printf("iteration: %dn", x);
if(ispunct(token[i])){
printf("print: 2n");
append(punctuationChar, token[i]);
check = 1;
你调用append(punctuationChar, token[i])
,但标点符号尚未初始化。这会产生未定义的行为。
为了克服这个问题,让我们punctuationChar
指向一个正确分配的内存空间,该空间使用有效字符串初始化,即具有字符串终止字符的内存空间;
要尝试一下,您可以简单地从以下方面开始:
char tempBuffer[100] = "something to start with";
char* punctationChar = tempBuffer;
这不会解决程序流中可能的问题;但它应该显示问题的根本原因。