所以这是我的代码:
int c;
char b[c];
scanf("%s",b);
c=strlen(b);
printf("\n");
printf("%s\n",b);
当我执行它时,它不断给我一个“分段错误(核心转储)”错误。我不想事先定义字符串大小。我想让程序在写完字符串后确定它。
非常感谢所有帮助。
答案 0 :(得分:0)
此
Select
Tourenstatistik.DATUM
Tourenstatistik.MITARBEITER,
VtsPause.Duration
From
Tourenstatistik
Left Join
(Select
Vtsbreak.MITARBEITER_NR,
sum(Vtsbreak.DAUER) duration,
Vtsbreak.datum
From
Vtsbreak
Where DATUM >= TO_DATE('2017/04/01', 'yyyy/mm/dd')
AND DATUM <= TO_DATE('2017/05/27','yyyy/mm/dd')
group by MITARBEITER_NR, datum) VtsPause
On (Tourenstatistik.MITARBEITER = VtsPause.MITARBEITER_NR
and Tourenstatistik.DATUM = VtsPause.DATUM)
Where Tourenstatistik.DATUM >= TO_DATE('2017/05/15', 'yyyy/mm/dd')
AND Tourenstatistik.DATUM <= TO_DATE('2017/05/16','yyyy/mm/dd')
order by Tourenstatistik.DATUM, Tourenstatistik.MITARBEITER
为您提供了未定义的行为,因为int c;
char b[c];
未初始化,但随后用作c
的数组大小。未定义的行为意味着事后可能发生任何事情,包括运行ok一段时间然后再进行核心转储。
听起来你想要的是从输入中确定字符串长度,但你不能用C中的数组来做,因为数组大小是常量,在声明数组时确定。相反,您需要使用动态分配的缓冲区,并在读取字符串时根据需要调整大小。如果您正在使用POSIX,您可以让stdio库在您的scanf调用中使用b
修饰符为您执行此操作:
m
如果您不使用POSIX C,则需要首先分配比可能需要的更大的缓冲区(并且可选择稍后调整它)或者根本不使用char *b;
if (scanf("%ms", &b) > 0) {
printf("%s\n", b);
free(b); }
。