简单的if语句在c中不起作用

时间:2012-08-05 22:49:14

标签: c if-statement

有人能告诉我为什么这段代码会崩溃吗?如果字符串的长度> 1,则很简单。超过16,再问一个字符串。如果我在if语句中写入control = 1,它会起作用,但如果没有它,它应该工作相同,因为那时控制的值是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 );

}

3 个答案:

答案 0 :(得分:8)

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

然后

scanf()将字符串读入该商店。

如果您读入的分配数量超过分配的数量,则在商店结束后内存已损坏。

这就是你崩溃的原因。

答案 1 :(得分:2)

问题在于,如果用户输入的字符超过了您为其分配空间的15个字符,那么计算机将在数组末尾的内存中快速写入所有这些字符。这将导致“未定义的行为”,包括崩溃您的程序。

答案 2 :(得分:1)

正如其他人所说,你的根本问题是你为字符串分配16个字符,scanf很乐意让你把这些16个字符写入内存中不属于你。

请注意C通常允许您对数组执行此操作,并了解标准C字符串的工作方式:您需要 null-terminate 它们,这意味着您将始终需要额外的空间在数组中为空终止字符\0

一种限制scanf相对于C字符串的方法,使用带有%s字段宽度说明符,如下所示:< / p>

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并逐个管理输入字符串。