【问题标题】:C Char Array Userinput check lengthC Char Array 用户输入检查长度
【发布时间】:2012-01-20 15:01:06
【问题描述】:

我读入带有scanfchar 数组,并想检查长度是否大于15。 它只在某些时候起作用。 (如果不是,我得到一个错误 --> 核心转储。)

我的代码:

#include <stdio.h>

int checkArray(char string[], int length) {
    int i;
    for(i=0; string[i] != '\0'; i++);
    if(i > length) {
        return -1;
    }
    return 0;
}

int main ()
{
    const int length = 15;
    char x[15];
    scanf("%s", x);
    if(checkArray(x, length) == -1) {
        printf("max. 15 chars!");
        return 1;
    }
    return 0;
}

【问题讨论】:

    标签: c arrays scanf


    【解决方案1】:

    而不是返回 -1 和 0 返回其他内容,例如长度而不是 -1 和 i 而不是 0 并相应地更改主函数中的条件。 然后程序每次都会给出输出。(不知道逻辑,但它对我有用)

    【讨论】:

      【解决方案2】:

      scanf 读入长度超过 14 个字符的字符串(为null 终止符保留一个)时,它会破坏内存。然后,您的 checkArray() 方法存在一些问题:

      int checkArray(char string[], int length) {
          int i;
      
          // This next line could as well be a call to `strlen`.
          // But you shouldn't let it access `string` when `i` is >= `length`. 
          for(i=0; string[i] != '\0'; i++);
      
          // This should be `>=`.  If `i` is 15, you accessed (in the loop above)
          // `string[15]`, which is past the end of the array.
          if(i > length) {
              return -1;
          }
      
          return 0;
      }
      

      【讨论】:

        【解决方案3】:

        这是典型的缓冲区溢出。需要限制读入的数据长度:

        scanf("%14s", x);
        

        或者,您可以告诉 scanf 为您分配缓冲区:

        char* x;
        scanf("%as", &x);
        ...
        checkArray(x, 15);
        

        这将为您提供的任何字符串分配足够长的缓冲区。 (当然限制物理内存和坏人向您的应用程序发送 10GB 数据)。

        这个字符串是动态分配的,所以需要释放:

        free(x);
        

        【讨论】:

        • 他想知道用户输入的字符是否超过 15 个。
        • 是在你编辑并添加动态分配部分之前。
        【解决方案4】:

        x 永远不能(合法地)超过 14 个字符,因为您将它放在大小为 15 的缓冲区中(14 个字符用于字符,一个用于 NUL 终止符),因此尝试检查是否没有意义长度小于 15 个字符。

        如果您尝试在其中存储大于 14 的字符串,它将超出数组,并可能导致您遇到的错误。可选地使您的数组更大,以便它实际上可以容纳超过 15 个字符并为%s 放置一个宽度说明符:

        char x[30];
        
        scanf("%29s", x); // read a maximum of 29 chars (replace 29 if needed
                          // with one less than the size of your array)
        
        checkArray(x, 15);
        

        【讨论】:

        • 您不妨将x 17:15 用于字符串,一个用于溢出,一个用于\0
        猜你喜欢
        • 1970-01-01
        • 2015-02-23
        • 2011-12-14
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 2011-11-19
        • 1970-01-01
        • 2017-10-05
        相关资源
        最近更新 更多