1

谁能告诉我为什么这段代码会崩溃?很简单,如果字符串的长度> 16,再请求一个字符串。如果我在 if 语句中写 control = 1 它可以工作,但是没有它它应该可以工作,因为此时 control 的值是 1,对吗?比(我正在学习)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(void)
{
    int control = 1;
    char word[16] ;
    printf("Enter a word: ");

    while(control == 1)
    {
        scanf("%s", word);

        int len = strlen(word);
        printf("Lenght is: %d\n", len);

        if (len >= 16) 
        {
            printf("Word lenght to long, enter a new one: ");
        }

        else
        {
            control = 0;
        }

    }
    printf("This is the word: %s\n", word );

}
4

3 回答 3

8

char word[16] 为字符串分配 16 个字节的存储空间。

scanf() 然后将一个字符串读入该存储区。

如果您读入的存储量超过了分配的存储量,则存储结束后内存会损坏。

这就是你崩溃的原因。

于 2012-08-05T22:51:58.637 回答
2

The problem is that if the user types more than the 15 characters which you have allocated space for, then the computer will merrily write all of them in memory past the end of your array. This will result in "undefined behavior" including crashing your program.

于 2012-08-05T22:55:41.910 回答
1

正如其他人所指出的,您的基本问题是您正在16为字符串分配字符,并且很scanf乐意允许您将这些16字符写入不属于您的内存中。

请注意,C 将允许您通常对数组执行此操作,并了解标准 C 字符串的工作原理:您需要对它们进行空终止,这意味着您总是需要在数组中为空终止字符留出额外的空间\0

一种方法可以限制scanfC 字符串,使用带有 的字段宽度说明符%s,如下所示:

char input[17];  // room for 16 characters plus null-terminator

// here scanf will stop after reading 16 characters:
scanf("%16s", input);

使用此代码,您可以安全地使用scanf不超过16字符的字符串填充字符串,并scanf为您终止字符串。

但正如其他人也指出的那样,scanf它在处理用户输入方面非常糟糕。通常最好fgets逐个使用和管理输入字符串。

于 2012-08-05T23:25:30.427 回答