【问题标题】:adding a 0 char after every even number in an array C在数组 C 中的每个偶数后添加一个 0 字符
【发布时间】:2015-12-15 13:22:18
【问题描述】:

我正在尝试用 C 创建一个程序,在每个偶数之后添加一个“0”。但我有一个问题。例如,如果我只插入偶数(5 个或更多数字),程序就会崩溃。

下面是我现在的程序。

我想要一些指示或代码示例来指出我做错了什么以及如何解决它。

void main()
{
    int *a, i, n, m;
    printf("dimensiune=");
    scanf_s("%d", &n);
    a = (int*)malloc(n*sizeof(int));
    for (i = 0; i < n; i++)
    {
        printf("a[%d]=", i + 1);
        scanf_s("%d", &a[i]);
    }
    for (i = 0; i < n; i++)
    {
        if (a[i] % 2 == 0)
        {
            n++;                                        
            a = (int*)realloc(a, n*sizeof(int));        
            for (m = n - 1; m > i;m--)                  
            {       
                a[m + 1] = a[m];                        
            }
            a[i + 1] = 0;                               
            i++;                                        
        }
    }
    printf("\n currently you have %d numbers in this string\n", n);

    printf("your string \n");

    for (i = 0; i < n; i++)
    {
        printf("a[%d]=%d\n", i + 1, a[i]);
    }
}

【问题讨论】:

  • void main() 最好是int main(void) 之类的。
  • 这个解决了,谢谢,你能解释一下为什么吗,void main()和int main(void)有什么区别?
  • 在使用realloc 并直接分配回您要重新分配的指针时要小心,如果realloc 失败,它将返回NULL,您将失去原来的指针。
  • void main() 是实现定义的入口点定义方式。 int main(void) 是标准之一。

标签: c arrays malloc realloc


【解决方案1】:

变化:

for (m = n - 1; m > i;m--)                  
    {       
    a[m + 1] = a[m];                        
    }

到:

for (m = n - 1; m > i;m--)                  
    {       
    a[m] = a[m-1];                        
    }

我刚刚测试过,它对我有用,应该对你有用。

【讨论】:

  • 我尝试了您的意见,效果很好,感谢您花时间测试我的代码。 :)
【解决方案2】:

我发现这个循环有问题:

    for (m = n - 1; m > i;m--)                  
    {       
        a[m + 1] = a[m];                        
    }

当你开始循环时,n 是循环中元素的数量。在第一次迭代期间,m 是循环的最后一个元素的索引。所以,m+1 在最后一个元素之后,造成缓冲区溢出。

【讨论】:

    【解决方案3】:

    感谢所有 cmets 我解决了将 void main() 替换为 int main(void) + Shady Programmer 提供的解决方案的错误。

    【讨论】:

    • 不,你没有,我刚刚将该代码注入我的编译器,即使使用int main(int argc , char** argv) 也会崩溃,请查看我的答案以获得正确的修复。
    猜你喜欢
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多