【问题标题】:The size of a string字符串的大小
【发布时间】:2020-11-25 20:51:00
【问题描述】:
#include <stdio.h>

int stringLength (char *text)
{
  int count = 0;
  while (*text != '\0')
  {
    count++;
    text++;
  }


  return count;
}


int main()
{
  char str[25];
  int length;

  printf("ENter string: ");
  scanf("%s", &str);

  length = stringLength(str);
  if (length > 25)
  {
    printf("Invalid\n");
    printf("Enter string: ");
    scanf("%s", &str);
  }
  printf("Your string is: %s and its %d long", str, length);
  return 0;
}

如果第一个输入错误(超过 25 个),它会记住那个数字(长度),当我输入另一个字符串时,它会将数字加在一起。我该如何解决它,让它从头开始?所以它会从头开始计算下一个字符串?

【问题讨论】:

  • stringLength 是否调用了新字符串?
  • 使用scanf("%24s", str);,您可以确保最多存储 24 个字符(必须为终止符留一个)
  • 如果字符串的长度超过24,将没有足够的空间来存储它和@987654324内的终止空字节@。如果发生这种情况,您将导致未定义的行为,可能会丢弃堆栈上的数据,例如length 变量和/或main() 函数的返回地址。将scanf("%s", &amp;str); 更改为scanf("%24s", &amp;str); 以避免这种情况。事后检查缓冲区溢出不是可靠的解决方案。

标签: c


【解决方案1】:

你不能这样。您的代码至少有两个问题:

  1. 将字符串传递给scanf 时不必使用&,因为str 已经是一个指针(在C 中搜索the equivalence pointer and array)。
  2. 如果您插入超过 25 个,则发生的是 buffer overflow 并且您的程序在 scanf 之后呈现未定义的行为。您可能需要考虑另一种更安全的键盘读取方法(例如fgets

【讨论】:

    【解决方案2】:
     char str[25];
    

    只能包含 24 个字符 + NULL 的字符串。将字符串扫描到scanf() 时,使用width specifier 将输入限制为小于缓冲区大小1。

    while() 循环替换if() 分支:

    length = stringLength(str);
      while(length > 24)// an array of 25 elements can only accommodate 24 characters + NULL 
      {
        printf("Invalid\n");
        printf("Enter string: ");
        //use input limiter of 24 for char str[25];
        scanf("%24s", str);//remove & (for all scanf scanning a string)
        length = stringLength(str);
      }
    

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2012-01-20
      • 2020-10-17
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多