这是kernighan&ritchie的1-17问题,这是一个非常简单的问题,但是当我使用值MAXLEN = 1000进行测试时,编译器显示了分段错误,我不十分清楚为什么,因为1000似乎是一个非常合理的值,它似乎可以工作10000,但为什么呢?
#include <stdio.h>
#define MINL 80
#define MAXLEN 1000
int get_line (char s[] , int lim )
{
int c,i,j;
for (i=0; (c=getchar())!=EOF && c!='\n';i++)
{
if (i<lim-2)
{
s[j]=c;
++j;
}}
if (c=='\n')
{
s[j]=c;
++i;
++j;
}
s[j]='\0';
return i;
}
int main ()
{
int len;
char line[MAXLEN];
while ((len=get_line(line,MAXLEN))>0)
{
if (len>MAXLEN)
{
printf("%s",line);
}
}
return 0;
}
答案 0 :(得分:0)
您应该为编译器打开警告。它会向您显示j
尚未初始化:
/home/user/main.c:11:15: warning: variable 'j' is uninitialized when used here [-Wuninitialized]
s[j]=c;
^
/home/user/main.c:6:14: note: initialize the variable 'j' to silence this warning
int c,i,j;
^
= 0
答案 1 :(得分:0)
如前所述,变量 j 未初始化,因此,当您设置s[j]
时,行为是不确定的,并且在您的情况下,您会遇到分段错误,因为您写出了数组。
实际上,您不需要该变量:
#include <stdio.h>
#define MAXLEN 10
int get_line (char s[] , int lim )
{
int c, i = 0;
lim -= 1;
while ((c=getchar()) != EOF)
{
if (i < lim)
{
s[i] = c;
}
i += 1;
if (c == '\n')
break;
}
s[(i < lim) ? i : lim] = '\0';
return i;
}
int main ()
{
int len;
char line[MAXLEN];
while ((len = get_line(line,MAXLEN)) > 0)
{
/*if (len>MAXLEN)*/
{
printf("%d '%s'\n", len, line);
}
}
return 0;
}
我更改了 MAXLEN 的值以轻松测试输入字符串是否更大的情况,以及 printf 来查看所有情况下的结果
编译和执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall g.c
pi@raspberrypi:/tmp $ ./a.out
aze
4 'aze
'
123456789
10 '123456789'
12345678
9 '12345678
'
1234567890
11 '123456789'
^C
要测试EOF情况:
pi@raspberrypi:/tmp $ echo aze | ./a.out
4 'aze
'
pi@raspberrypi:/tmp $
答案 2 :(得分:0)
以下建议的代码:
select *,
case when number happens first time then 1 else null
over (partition by account order by number) from table.
account number expected output
abc 20 1
abc 20 0
abc 30 1
def 20 1
def 30 1
def 30 0
语句现在,建议的代码:
#define