【发布时间】:2019-11-25 19:00:13
【问题描述】:
几周前我刚刚了解了字符串,我对制作自己的函数很感兴趣。一开始我尝试了一个短句,它成功了,但是当我尝试长句时遇到了问题......
问题可能出在“getSplitText”函数中,我该如何解决这个错误?
在这种情况下使用 for 循环不好吗?
之前
之后
这是我的代码
#include <stdio.h>
#include <stdlib.h>
char *getSplitText(char *var_text, char split, int index);
int getLengthSplitText(char *var_text, char split);
int getLengthString(char *var_text);
int main(){
char var_text[100];
fgets(var_text,100,stdin);
int i;
printf("Total Characters: %d\n",getLengthString(var_text));
printf("Total Words: %d\n",getLengthSplitText(var_text,' '));
printf("Split Result:\n");
for(i=1;i<=getLengthSplitText(var_text,' ');i++){
printf("#%d-%s\n",i,getSplitText(var_text,' ',i));
}
return 0;
}
int getLengthString(char *var_text){
int len = 0, i = 0;
while (var_text[i] != '\0'){
len++;
i++;
}
return len;
}
int getLengthSplitText(char *var_text, char split){
int textlen = getLengthString(var_text);
int lenKata=0;
char *resultKata = malloc(sizeof(char) * textlen);
resultKata[0]='\0';
int i,j=0;
for(i=0;i<textlen;i++){
if(var_text[i]!=split){
if(textlen-1==i){
resultKata[j] = var_text[i];
resultKata[j + 1] = '\0';
lenKata ++;
}else {
resultKata[j] = var_text[i];
j++;
resultKata[j + 1] = '\0';
}
//printf("#1 %s\n",resultKata);
}else if(var_text[i]==split){
if(resultKata[0]!='\0'){
lenKata ++;
}else{
j = 0;
resultKata[0] = '\0';
}
}
//printf("#2 %s\n",resultKata);
}
return lenKata;
}
char *getSplitText(char *var_text,char split, int index){
int textlen = getLengthString(var_text);
char *resultKata = malloc(sizeof(char) * textlen);
resultKata[0]='\0';
if(index<=getLengthSplitText(var_text,split)) {
int i,j=0;
int lenKata=0;
for (i = 0; i < textlen; i++) {
if (var_text[i] != split) {
if (textlen - 1 == i) {
resultKata[j] = var_text[i];
resultKata[j + 1] = '\0';
lenKata++;
break;
} else {
resultKata[j] = var_text[i];
j++;
resultKata[j + 1] = '\0';
}
//printf("#1 %s\n",resultKata);
} else if (var_text[i] == split) {
if (resultKata[0] != '\0') {
lenKata++;
if (lenKata == index) {
resultKata[j] = '\0';
break;
} else {
j = 0;
resultKata[0] = '\0';
}
}
//printf("#2 %s\n",resultKata);
}
}
}
return resultKata;
}
【问题讨论】:
-
作为纯粹的文体问题,您应该使用
break;而不是goto END_LOOP; -
你也不应该使用
gets。它的手册页明确说明了这一点。这可能是您的问题的原因(或者至少,允许它未被检测到)。您的字符串缓冲区包含 20 个char值,这为您提供了 19 个可用的字符串值加上一个终止空字符。如果您输入任何大于 19 个字符的字符串,您将写到数组的末尾,并受到未定义行为的影响。 -
函数:
gets()已经贬值多年,在最后两个 C 版本中完全删除。建议阅读fgets()的 MAN 页面并使用该函数 -
关于:
char *resultKata = malloc(sizeof(char) * textlen);1) 表达式:sizeof(char)在 C 标准中定义为 1。将任何内容乘以 1 没有任何效果,只会使代码混乱。建议删除该表达式。 2) 函数:malloc()需要一个类型为:size_t的参数,但textlen被声明为int3) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功,调用perror( "malloc failed" );将你的错误信息和系统认为错误发生的文本原因输出到stderr