Strlen()函数给出“分段错误”错误

时间:2017-05-29 18:13:28

标签: segmentation-fault strlen

所以这是我的代码:

int c;
char b[c];

scanf("%s",b);
c=strlen(b);

printf("\n");
printf("%s\n",b);

当我执行它时,它不断给我一个“分段错误(核心转储)”错误。我不想事先定义字符串大小。我想让程序在写完字符串后确定它。

非常感谢所有帮助。

1 个答案:

答案 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); }