用指针影响字符串
impacting Strings with pointers
无效的代码。在函数 main
中,在用户初始化变量后,它转到 if
部分,然后发生崩溃。该程序的目标是影响字符串中的重复字符。所以我决定在函数 f1
中有一个指针,指针应该指向数组 kar[]
的 0th
字符
然后将 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
的范围)。在 C 数组索引中,第一个元素从 0 开始。
要扫描到 kar
,只需传递 kar
的第一个 元素的地址。
scanf("%s", &kar[0]);
由于数组在传递给函数时会衰减到其第一个元素的地址,因此以下语句是等效的
scanf("%s", kar);
请注意,上面的两个语句很好地允许用户输入更多的字符,然后 kar
可以容纳并且这样会使 scanf()
溢出 kar
,即超出它的写入边界,调用未定义的行为,这可能会使您的程序或其他任何崩溃...
为了避免这种情况告诉scanf()
扫描的最大值:
scanf("%999s", kar);
一个字符串在 C 中可以容纳的最大值 char
总是比定义的少一个,因为 C 字符串还需要一个 char
来让它们的结尾用 '[=26=]'
终止符标记。
无效的代码。在函数 main
中,在用户初始化变量后,它转到 if
部分,然后发生崩溃。该程序的目标是影响字符串中的重复字符。所以我决定在函数 f1
中有一个指针,指针应该指向数组 kar[]
的 0th
字符
然后将 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
的范围)。在 C 数组索引中,第一个元素从 0 开始。
要扫描到 kar
,只需传递 kar
的第一个 元素的地址。
scanf("%s", &kar[0]);
由于数组在传递给函数时会衰减到其第一个元素的地址,因此以下语句是等效的
scanf("%s", kar);
请注意,上面的两个语句很好地允许用户输入更多的字符,然后 kar
可以容纳并且这样会使 scanf()
溢出 kar
,即超出它的写入边界,调用未定义的行为,这可能会使您的程序或其他任何崩溃...
为了避免这种情况告诉scanf()
扫描的最大值:
scanf("%999s", kar);
一个字符串在 C 中可以容纳的最大值 char
总是比定义的少一个,因为 C 字符串还需要一个 char
来让它们的结尾用 '[=26=]'
终止符标记。