【问题标题】:Simple if statement in c that doesn't workc中的简单if语句不起作用
【发布时间】:2012-08-05 22:49:13
【问题描述】:

谁能告诉我为什么这段代码会崩溃?很简单,如果字符串的长度> 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 );

}

【问题讨论】:

    标签: c if-statement


    【解决方案1】:

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

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

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

    这就是你崩溃的原因。

    【讨论】:

    • 还要记住终止 NULL 字符算作已分配的 16 个字符之一。
    • 当然希望 SO 仅将获得最佳答案计为 10 分,而不是每次投票获得 10 分。如果我写一个需要多年经验的无锁问题的答案,我可能会得到一两票,因为还有谁知道呢?我就一个基本的C题写了一个简单的布道,嘿嘿,八票。这是 beer'n'pretzels 投票。它实际上并没有反映出任何东西,只是让接受者感觉良好。
    • 还要考虑越深奥的问答,观众越少,投票数就越少。
    【解决方案2】:

    问题在于,如果用户键入的字符超过了您为其分配空间的 15 个字符,那么计算机会愉快地将它们全部写入内存中,直到数组末尾。这将导致“未定义的行为”,包括使您的程序崩溃。

    【讨论】:

      【解决方案3】:

      正如其他人所指出的,您的根本问题是您正在为字符串分配 16 字符,而 scanf 很乐意让您将那些 16 字符写入不属于您的内存中.

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

      一种方法来限制 scanf 相对于 C 字符串,使用带有 %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 并自行管理输入字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-28
        • 1970-01-01
        相关资源
        最近更新 更多