【发布时间】:2014-10-01 08:45:40
【问题描述】:
我的代码中不断出现 valgrind 错误,我不知道如何修复它。 :/ 这个想法是,无论输入中的 2 个或多个单词/字母之间有多少制表符/空格,在输出中它应该只有一个空格。 例如:
a b c d -> a b c d
代码:
char* echo(char* in) {
char buffer[256];
int incounter=0, buffcounter=0;
while(incounter<(strlen(in))) {
if(in[incounter] == ' ' || in[incounter] == '\t') incounter++;
else if(in[incounter] != ' ' && in[incounter] != '\t') {
while(in[incounter] != ' ' && in[incounter] != '\t') {
buffer[buffcounter] = in[incounter]; //53
incounter++;
buffcounter++;
}
buffer[buffcounter] = ' ';
buffcounter++;
}
}
char* out = buffer;
return out;
}
错误:
==20521== Conditional jump or move depends on uninitialised value(s)
==20521== at 0x4010B4: echo (hhush.c:53)
==20521== by 0x4021CA: readCommand (hhush.c:327)
==20521== by 0x402538: main (hhush.c:371)
==20521== Uninitialised value was created by a stack allocation
==20521== at 0x402017: readCommand (hhush.c:301)
==20521==
==20521== Conditional jump or move depends on uninitialised value(s)
==20521== at 0x4010CE: echo (hhush.c:53)
==20521== by 0x4021CA: readCommand (hhush.c:327)
==20521== by 0x402538: main (hhush.c:371)
==20521== Uninitialised value was created by a stack allocation
==20521== at 0x402017: readCommand (hhush.c:301)
这就是我现在的位置,仍然是同样的错误
char* echo(char* in,char* buffer){
size_t inlen=strlen(in);
int incounter=0,buffcounter=0;
while(incounter<inlen){
if(in[incounter]==' '||in[incounter]=='\t')incounter++;
else{
while(in[incounter]!=' '&&in[incounter]!='\t'){
buffer[buffcounter]=in[incounter];
incounter++;
buffcounter++;
}
buffer[buffcounter]=' ';
buffcounter++;
}
}
return buffer;
}
我称之为:
char input[256];
fgets(input,sizeof(input),stdin);
...
char buffer[256];
printf("%s\n",echo(input,buffer));
【问题讨论】:
-
是什么让你认为 strlen(in)
-
函数永远不会被更大的输入调用
-
为什么每次循环迭代都计算
strlen(in)?它不会改变。 OTAH,我觉得这部分可以直接去掉if(in[incounter] != ' ' && in[incounter] != '\t')。 -
则不会跳过空格
-
内部while循环可以在输入字符串的末尾运行
标签: c arrays error-handling char