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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用指针影响字符串[关闭]相关的知识,希望对你有一定的参考价值。

代码不起作用。在用户初始化变量后的函数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);
        }

    }
}
答案

这个

      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,以便用''terminator标记它们的结尾。

以上是关于用指针影响字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

rootView上的Android片段空指针异常[关闭]

解决方案电影标题中缺少代码的片段,完成挑战更多[关闭]

将字符串数据从Activity发送到片段[关闭]

手电筒片段 Android Studio

如何使用tablayout和片段管理java文件[关闭]

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?