用指针影响字符串[关闭]
Posted
技术标签:
【中文标题】用指针影响字符串[关闭]【英文标题】:impacting Strings with pointers [closed] 【发布时间】:2018-06-11 14:57:57 【问题描述】:不工作的代码。在用户初始化变量后的函数main
中,它转到if
部分,然后发生崩溃。该程序的目标是影响字符串中的重复字符。所以我决定在函数f1
中有一个指针,指针应该指向数组0th
的字符kar[]
然后将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);
【问题讨论】:
现在是learn how to debug your programs的最佳时机。 虽然有一些提示:scanf
函数期望什么样的参数?如何访问数组中的单个元素?未初始化的局部变量,包括像kar
这样的数组是未初始化的,具有indeterminate(并且看似随机)的值。听听你的编译器,它应该为那个程序对你大喊大叫。
还有how to write readable code。
@Someprogrammerdude 这仅适用于合理的编译器,不一定适用于所有可能的编译器。 : ]
【参考方案1】:
这个
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
s 的最大值总是比定义为 C 字符串需要多一个 char
以使其结尾由 '\0'
terminator 标记。
【讨论】:
以上是关于用指针影响字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章