用指针影响字符串[关闭]

问题描述 投票:-8回答:1

代码不起作用。在用户初始化变量后的函数main中,它转到if部分,然后发生崩溃。该程序的目标是影响字符串中的重复字符。所以我决定在函数f1中有一个指针,指针应该指向数组0thkar[] char 然后将0th char1st char进行比较,但程序在最后一次scanf("%s",kar[1000]).之后完全崩溃了问题在哪里?

#include <stdio.h>
char f1(char* p)
{
    int i=0,c=1;
    while(*(p+i))
    {
        if(*p==*(++p))
        {
            c+=1;
            p++;
            i++;
            continue;           
        }
        else
        {
            if(c>1)
            {
                printf("%c%d",*p,c);
            }
            else
            {
                printf("%c",*p);
            }
        }
    i++;
    }
}



int main()
{
    int n,i,m;
    char kar[1000];
    scanf("%d",&n);
    for(i=1;i<=(2*n);++i)
    {
        scanf("%d",&m);
        scanf("%s",kar[1000]);
        if(m==1)
        {
            f1(kar);
        }

    }
}
c crash scanf
1个回答
3
投票

这个

      scanf("%s",kar[1000]);

应该触发编译器警告,因为你传递char,其中char*是预期的。你传递了kar的1001个元素(这是kar的界限,BTW)。在C数组索引中,第一个元素以0开头。

要扫描到kar,只需传递kar的第一个元素的地址。

      scanf("%s", &kar[0]);

当数组在传递给函数时被衰减到它们的第一个元素的地址时,以下语句是等价的

      scanf("%s", kar);

请注意,上面两个语句很好地允许用户输入更多的字符,然后kar可以容纳,并使此scanf()溢出kar,写入超出它的边界,调用未定义的行为,这可能会崩溃您的程序或其他...

为避免这种情况,请通过执行以下操作告诉scanf()扫描的最大值:

      scanf("%999s", kar);

字符串在C中可以容纳的chars的最大值总是小于C字符串,因为C字符串需要一个char,以便用'\0'terminator标记它们的结尾。

© www.soinside.com 2019 - 2024. All rights reserved.