用指针影响字符串[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用指针影响字符串[关闭]相关的知识,希望对你有一定的参考价值。
代码不起作用。在用户初始化变量后的函数main
中,它转到if
部分,然后发生崩溃。该程序的目标是影响字符串中的重复字符。所以我决定在函数f1
中有一个指针,指针应该指向数组0th
的kar[]
char
然后将0th char
与1st 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中可以容纳的char
s的最大值总是小于C字符串,因为C字符串需要一个char
,以便用' '
terminator标记它们的结尾。
以上是关于用指针影响字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章