我正在用C语言编写程序,以下函数接受三个参数,并将字符串中的字符替换为另一个字符。好吧,它的大部分工作都很好,但是当我尝试执行这部分代码时遇到错误:str [pos] = ch;。错误显示“访问冲突写入位置0x0133585B。”
void kstrput(char *str, size_t pos, char ch)
{
if(pos > strlen(str))
{
abort();
}
str[pos] = ch;
}
主要部分:
char *kstr = "hello";
int pos = 3;
char s = '\0';
printf("\n Enter a character ");
scanf("%c", &s);
kstrput(kstr,pos,s); // calling the kstrput function
printf("\n After kstrput: %s",kstr); //printing the struct to check value of the string
答案 0 :(得分:2)
"hello"
是常量(不可修改),并且可能(可能)存储在只读存储器中。
指向它的正确方法是使用类型const char *
的指针。
在这种情况下,您需要定义char
数组并将其初始化为“ hello”:
char kstr[] = "hello";
还请注意,在kstrput
中,如果pos
等于strlen(str)
,则它将覆盖'\0'
,后者指示字符串的结尾。
更好地使用:
if(pos >= strlen(str))
答案 1 :(得分:1)
“访问冲突写入位置0x0133585B。”
你做
{
int pos = 3;
...
char *kstr = "hello";
...
kstrput(kstr,pos,s); // calling the kstrput function
}
void kstrput(char *str, size_t pos, char ch)
{
str[pos] = ch;
...
}
str[pos] = ch;
pos 中的值3是有效索引,而 str 是字符串文字“ hello”,不能修改字符串文字
答案 2 :(得分:0)
函数void kstrput(char * str,size_t pos,char ch)中的这一行
if(pos > strlen(str))
应替换为
if(pos >= strlen(str))