首页 > 解决方案 > For 循环运行太频繁

问题描述

我有一个 for 循环,它应该运行 4 次,但运行了 6 次。你能解释一下这种行为吗?这很奇怪,因为 stringarr1 没有改变。

编辑:我想删除所有“!” 从我的第一个字符串中,并希望将字母保存在第二个字符串中。

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

int main(){

  char stringarr1[] = "a!bc";
  char stringarr2[] = "";

  printf("%d\n", strlen(stringarr1));  // lenght --> 4

  for (size_t i = 0; i < strlen(stringarr1); i++)  
  {
      printf("i: %d\n", i);
      if (stringarr1[i] != '!') {
        stringarr2[strlen(stringarr2)] = stringarr1[i];
        printf("info: != '!'\n");
      }          
  }
}

标签: carraysstringfor-loop

解决方案


您的代码可以运行任意次数。你写的超出了结尾,stringarr2所以你可能会破坏堆栈并覆盖局部变量。你的意思可能是这样的:

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

int main(){

  char stringarr1[] = "a!bc";
  char stringarr2[10];
  int len = strlen(stringarr1);

  printf("%d\n", len);  // lenght --> 4

  for (size_t i = 0; i < len; i++)  
  {
      printf("i: %d\n", i);
      if (stringarr1[i] != '!') {
        stringarr2[len] = stringarr1[i];
        printf("info: != '!'\n");
      }          
  }
}

就像其他人说的那样,您在这里想要完成什么并不是很清楚。但是在 C 中,像这样的声明char s[] = "string"只分配足够的内存来存储赋值右侧的任何内容。如果在您的情况下这是一个空字符串,则只分配一个字节,以存储字符串结尾的“空”字符。您需要像我一样明确指定要分配的字节数作为数组大小,或者使用动态内存分配。


推荐阅读