使用 strtok [C] 程序崩溃
Program crashes with strtok [C]
我在使用函数 strtok()
时遇到了一些问题。
在这个练习中,我的老师要求使用它来标记单个字符串,然后将偶数词保存在列表中,然后打印所有偶数标记及其出现。但是在我写入输入字符串后程序崩溃了。有人可以解释一下问题出在哪里吗?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define Dim 100
struct node{
int occ;
char sbuffer[Dim];
struct node *next;
};
struct node *first = NULL;
void occorrenze();
void insert(char *tkn);
int main(){
char array[Dim];
char buff[Dim];
char* token;
printf("Insert string: ");
gets(array);
for(token=strtok(array, " ") ; token!=NULL ; token=strtok(NULL," ") ){
if ((strlen(token)%2)==0){
insert(token);
}
}
occorrenze();
}
void insert(char *tkn) {
struct node *new_node;
new_node = (struct node*)malloc(sizeof(struct node));
strcpy(new_node->sbuffer, tkn);
new_node->occ = 1;
new_node->next = first;
first = new_node;
}
void occorrenze() {
struct node *p;
struct node *s;
for(p = first; p != NULL; p = p->next){
for(s = p; s != NULL; s = s->next){
if(strcmp(s->sbuffer, p->sbuffer) == 0){
p->occ++;
}
}
}
printf("\n%s\n%d\n",p->sbuffer, p->occ);
}
(抱歉我的英语不好^^)
问题是你的 printf()
在 occorrenze()
末尾
printf("\n%s\n%d\n",p->sbuffer, p->occ);
此时 p
为 NULL 因为你的 for
循环已经完成
for (p = first; p != NULL; p = p->next) {
你找到匹配的代码基本上是正确的,我只是稍微修改一下(你只需要一个循环)并将它移到 insert()
这样你就不必如果单词已经在列表中,则再次添加单词,然后 occorenze()
可以简单地遍历列表并打印单词及其 occ
值:
void insert(char *tkn) {
struct node *new_node;
new_node = (struct node*)malloc(sizeof(struct node));
for (struct node *n = first; n != NULL; n = n->next) {
if (strcmp(tkn, n->sbuffer) == 0) {
n->occ++;
return;
}
}
strcpy(new_node->sbuffer, tkn);
new_node->occ = 1;
new_node->next = first;
first = new_node;
}
void occorrenze() {
for (struct node*n = first; n != NULL; n = n->next) {
printf("%d %s\n", n->occ, n->sbuffer);
}
}
我在使用函数 strtok()
时遇到了一些问题。
在这个练习中,我的老师要求使用它来标记单个字符串,然后将偶数词保存在列表中,然后打印所有偶数标记及其出现。但是在我写入输入字符串后程序崩溃了。有人可以解释一下问题出在哪里吗?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define Dim 100
struct node{
int occ;
char sbuffer[Dim];
struct node *next;
};
struct node *first = NULL;
void occorrenze();
void insert(char *tkn);
int main(){
char array[Dim];
char buff[Dim];
char* token;
printf("Insert string: ");
gets(array);
for(token=strtok(array, " ") ; token!=NULL ; token=strtok(NULL," ") ){
if ((strlen(token)%2)==0){
insert(token);
}
}
occorrenze();
}
void insert(char *tkn) {
struct node *new_node;
new_node = (struct node*)malloc(sizeof(struct node));
strcpy(new_node->sbuffer, tkn);
new_node->occ = 1;
new_node->next = first;
first = new_node;
}
void occorrenze() {
struct node *p;
struct node *s;
for(p = first; p != NULL; p = p->next){
for(s = p; s != NULL; s = s->next){
if(strcmp(s->sbuffer, p->sbuffer) == 0){
p->occ++;
}
}
}
printf("\n%s\n%d\n",p->sbuffer, p->occ);
}
(抱歉我的英语不好^^)
问题是你的 printf()
在 occorrenze()
printf("\n%s\n%d\n",p->sbuffer, p->occ);
此时 p
为 NULL 因为你的 for
循环已经完成
for (p = first; p != NULL; p = p->next) {
你找到匹配的代码基本上是正确的,我只是稍微修改一下(你只需要一个循环)并将它移到 insert()
这样你就不必如果单词已经在列表中,则再次添加单词,然后 occorenze()
可以简单地遍历列表并打印单词及其 occ
值:
void insert(char *tkn) {
struct node *new_node;
new_node = (struct node*)malloc(sizeof(struct node));
for (struct node *n = first; n != NULL; n = n->next) {
if (strcmp(tkn, n->sbuffer) == 0) {
n->occ++;
return;
}
}
strcpy(new_node->sbuffer, tkn);
new_node->occ = 1;
new_node->next = first;
first = new_node;
}
void occorrenze() {
for (struct node*n = first; n != NULL; n = n->next) {
printf("%d %s\n", n->occ, n->sbuffer);
}
}