我想用C语言编写一个程序,把一个完整句子中的每个单词(作为输入)单独显示在一行中,这是我目前所做的:
void manipulate(char *buffer);
int get_words(char *buffer);
int main(){
char buff[100];
printf("sizeof %d\nstrlen %d\n", sizeof(buff), strlen(buff)); // Debugging reasons
bzero(buff, sizeof(buff));
printf("Give me the text:\n");
fgets(buff, sizeof(buff), stdin);
manipulate(buff);
return 0;
}
int get_words(char *buffer){ // Function that gets the word count, by counting the spaces.
int count;
int wordcount = 0;
char ch;
for (count = 0; count < strlen(buffer); count ++){
ch = buffer[count];
if((isblank(ch)) || (buffer[count] == '\0')){ // if the character is blank, or null byte add 1 to the wordcounter
wordcount += 1;
}
}
printf("%d\n\n", wordcount);
return wordcount;
}
void manipulate(char *buffer){
int words = get_words(buffer);
char *newbuff[words];
char *ptr;
int count = 0;
int count2 = 0;
char ch = '\n';
ptr = buffer;
bzero(newbuff, sizeof(newbuff));
for (count = 0; count < 100; count ++){
ch = buffer[count];
if (isblank(ch) || buffer[count] == '\0'){
buffer[count] = '\0';
if((newbuff[count2] = (char *)malloc(strlen(buffer))) == NULL) {
printf("MALLOC ERROR!\n");
exit(-1);
}
strcpy(newbuff[count2], ptr);
printf("\n%s\n",newbuff[count2]);
ptr = &buffer[count + 1];
count2 ++;
}
}
}
虽然输出是我想要的,但是在显示的最后一个单词后面有很多空格,并且malloc()返回NULL,所以最后显示MALLOC ERROR!。我可以理解在我的malloc()实现中有一个错误,但是我不知道它是什么。
有没有其他更优雅或更好的方式来做呢?
9条答案
按热度按时间hxzsmxv21#
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
看看这个,用空白字符作为分隔符。如果你需要更多的提示,让我知道。
从网站:
在第一次调用时,该函数需要一个C字符串作为str的参数,其第一个字符用作扫描标记的起始位置;在后续调用中,该函数需要一个空指针,并使用最后一个标记末尾之后的位置作为新的扫描起始位置。
一旦在对strtok的调用中找到str的终止空字符,则对该函数的所有后续调用(以空指针作为第一个参数)都将返回空指针。
参数编号
返回值
指向字符串中最后一个标记的指针。如果没有标记可供检索,则返回空指针。
示例
9udxz4iz2#
为了好玩,这里有一个基于回调方法的实现:
u5rb5r593#
malloc(0)
可以(可选地)返回NULL
,这取决于实现。您是否意识到您可能调用malloc(0)
的原因?或者更准确地说,您是否看到您正在阅读和写入超出数组大小的位置?798qvoo84#
考虑使用
strtok_r
,就像其他人建议的那样,或者类似于:cgyqldqp5#
出错的地方是
get_words()
总是返回比实际字数少一的值,因此最终您尝试:最终,
count2
总是比您为newbuff[]
声明的元素数多一个,但我不知道为什么malloc()
没有返回有效的ptr。hec6srdp6#
你应该malloc'ing strlen(ptr),而不是strlen(buf).另外,你的count2应该被限制在单词的数量.当你到达你的字符串的末尾,你继续检查你的缓冲区中的零,并添加零大小的字符串到你的数组.
u4dcyp6a7#
作为C语言中字符串操作的一种不同风格,这里有一个例子,它不修改源字符串,也不使用
malloc
。为了查找空格,我使用了libc函数strpbrk
。6tdlim6h8#
你可以扫描字符数组来寻找标记如果你找到了它就打印新行否则打印字符r。
wko9yo5t9#