字符串长度如何打印超过char数组的大小,如果输入更多,那么char数组?

时间:2015-06-10 12:47:43

标签: c string

#include<stdio.h>

int main(){
    char s1[100];
    printf("Enter String \n");
    scanf("%s",s1);
    int i;
    for(i=0;s1[i]!='\0';i++);
    printf("Length : %d \n",i);
    return 0;
}

在上面的程序中,我试图找到字符串的长度。因为我创建了大小为100的char数组但是当我提供更多的输入然后是长度100仍然是打印长度高达141之后我得到“堆栈粉碎检测”错误。怎么打印长度超过100?

3 个答案:

答案 0 :(得分:3)

首先,鉴于您已将字符串定义为char s1[100];,请通过更改格式说明符来限制scanf的字符串输入长度:

scanf("%s",s1);

为:

scanf("%99s",s1);// 99, + 1 for NULL terminator

关于缓冲区溢出
如果您定义一个字符串,请说:

char string[5];//holds 4 characters and a NULL terminator

在记忆中,它可能如下所示:

|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0
                      |^ ^ ^ ^ ^| (Allocated space)

strcpy(string,&#34; hold&#34;); 结果:

|0|0|0|0|0|0|0|0|0|0|0|h|o|l|d|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0
                      |^ ^ ^ ^ ^| (Allocated space)

没问题,您已写入变量所拥有的区域。

如果分配的内容超过应保留的数量:

strcpy(string, "holds more...");

结果:

|0|0|0|0|0|0|0|0|0|0|0|h|o|l|d|s| |m|o|r|e|.|.|.|0|0|0|0|0|0|0|0|0|0|0
                      |^ ^ ^ ^ ^| (Allocated space)

如果分配给缓冲区的内存后面的内存连续区域为空,并且当您写入它们时其他任何进程当前未使用/无人认领,那么写入它们的行为将显示无效,即它似乎&#34;工作&#34;和 printf(,,)可以很好地 打印缓冲区。但是稍后,您可能会尝试写入同一区域并发现您收到错误。这是 undefined behavior 的示例。

以下是 avoiding buffer overflow 的更多信息。

答案 1 :(得分:1)

C不会超出范围检查。因此,写入和读取数组之外的位置会调用Undefined Behavior。任何事情都可能发生。

答案 2 :(得分:1)

你正在做string overflow,你在字符串中填充了它可以容纳的更多字符,在C中它会导致未定义的行为。

请记住,您需要分配n + 1(n =字符串的大小)来存储NULL-terminator值。 您可以限制在scanf中读取的字符数,这样可以防止字符串溢出。

即:

scanf("%99s",s1);