用指针影响字符串

impacting Strings with pointers

无效的代码。在函数 main 中,在用户初始化变量后,它转到 if 部分,然后发生崩溃。该程序的目标是影响字符串中的重复字符。所以我决定在函数 f1 中有一个指针,指针应该指向数组 kar[]
0th 字符 然后将 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);
        }

    }
}

这个

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

应该触发编译器警告,因为您传递了一个 char 而应该是 char*。您传递了 kar 的第 1001 个元素(顺便说一句,它超出了 kar 的范围)。在 C 数组索引中,第一个元素从 0 开始。

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

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

由于数组在传递给函数时会衰减到其第一个元素的地址,因此以下语句是等效的

      scanf("%s", kar);

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

为了避免这种情况告诉scanf()扫描的最大值:

      scanf("%999s", kar);

一个字符串在 C 中可以容纳的最大值 char 总是比定义的少一个,因为 C 字符串还需要一个 char 来让它们的结尾用 '[=26=]' 终止符标记。