我是新程序员。 你能帮我解释为什么这个C测试程序不能正常工作吗? 它应该是一个修剪函数:
#include <stdio.h>
#define MAX 1000
void main(){
char line[MAX];
int lgh;
line[0] = '\0';
while ((lgh = getLine(line, MAX)) != 0){
printf("%s", line);
line[0] = '\0';
}
}
int getLine(char s[], int length){
char s2[length];
int i, ii, qttWord = 0, qttWord2 = 0;
int c; // c = getchir() d = EOF
int flag = 2;
s2[0] = '\0';
/*Reads the input and puts it into s[], then, verifies if the input is just \n,
* if so, returns 0(i), if not, puts '\n' at the end of the string ind '\0' to close
*/
for (i = 0; i < length-1 && (c = getchar()) != EOF && c != '\n'; ++i){
s[i] = c;
++qttWord;
}
if (i == 0){
if (c == '\n')
return 0;
} else if (c == '\n'){
s[i] = c;
++qttWord;
++i;
s[i] = '\0';
}
fflush(stdin);
/*Verifies if the string is just ' ' or '\t'
* if so, returns 0
*/
for (i = 0; i <= qttWord && flag != 1; ++i){
if (s[i] == ' ' || s[i] == '\t'){
flag = 0;
} else{
flag = 1;
}
}
if (flag == 0)
return 0;
/*
*The trim function
*/
for (i = 0; i < qttWord; ++i){
if (i < qttWord-1){
if (s[i] == ' ' && s[i+1] != ' '){
s2[i] = s[i];
++qttWord2;
printf("1%d\n", s2[i]);//test thing
}
}
if (s[i] != ' '){
s2[i] = s[i];
++qttWord2;
printf("0%d\n", s2[i]);//test thing
}
}
s[0] = '\0';
s2[qttWord2+1] = '\0';
printf("Q:%d\n", qttWord2);//test thing
printf("A:%s\n", s2);//test thing
for (i = 0; i < qttWord2+1; ++i){
s[i] = s2[i];
}
return 1;
}
正如您所看到的,我创建了一系列printf测试,以了解它为什么不起作用,但它没有帮助。 我不明白为什么它不起作用。
答案 0 :(得分:1)
使用更多标准库函数,特别是fgets()
来读取行,isspace()
来标识空格字符,memmove()
来复制数据,产生以下代码:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX 1000
static int getLine(char s[], int length);
int main(void)
{
char line[MAX];
int lgh;
/* Stop on EOF or a blank line */
while ((lgh = getLine(line, MAX)) > 0)
printf("%d <<%s>>\n", lgh, line);
return(0);
}
/*
** Get a line of input with leading and trailing white space
** stripped off. The newline is not included. If there is no
** newline in the space available, the length 0 is returned.
** If EOF is encountered, EOF is returned.
*/
static int getLine(char s[], int length)
{
char s2[length];
s[0] = '\0';
if (fgets(s2, sizeof(s2), stdin) == 0)
return EOF;
size_t len = strlen(s2);
if (s2[len-1] != '\n')
return 0; /* No newline - line too long */
/* Find first non-white space */
size_t off = 0;
while (isspace(s2[off]))
off++;
if (off > len)
return 0;
/* Chop trailing space */
while (len-- > 0 && isspace(s2[len]))
s2[len] = '\0';
/* Non-blank string is in s2[off]..s2[len], plus trailing '\0' */
memmove(s, &s2[off], len-off+2);
return(len - off + 1); /* Length excluding trailing null */
}
请注意main()
中的诊断输出包括报告的长度以及精心分隔的输出字符串,后跟换行符。显然,如果您愿意,可以使用严格检查空白和制表符的代码替换isspace()
。您可以编写自己的fgets()
类似物。
你的原始代码在第一行输入后得到EOF时不喜欢它(我不认为我在空输入上尝试了它)。务必确保妥善处理堕落的案件。