Visual Studio告诉我,我的代码问题在
行*p = *p1;
但我不明白那里有什么不对
此代码中的目标是构建一个函数,该函数将获取字符串和int,并将对字符串进行排序并返回int的索引中的字母。
例如,对于字符串“build”,如果int为2将返回“i”,则将其排序为“bdilu”。
这是我写的代码:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
char letterAtIndex(char *s, int n);
void main(){
char s, *arr = { "a string" };
s=letterAtIndex(arr, 7);
printf("%c", s);
getch();
}
char letterAtIndex(char *s, int n){
int t;
char *p1 = s, *p2 = s, *p;
while (*(++p2));
while (p1 < p2){
p = p1;
while (p < p2){
if (*p1>*p){
t = *p;
*p = *p1;
*p1 = t;
}
p++;
}
p1++;
}
return s[n];
}
这就是错误:
Unhandled exception at 0x00F81436 in justforstudy.exe: 0xC0000005:
Access violation writing location 0x00F85859.
答案 0 :(得分:3)
您将字符串文字传递给函数letterAtIndex
。你不能写信给它。将char *arr = { "a string" };
更改为char arr[] = { "a string" };
即可。char arr[]
是一个类型为char
且可读写的元素数组:
int main(){
char arr[] = { "a string" };
char s = letterAtIndex( arr, 7 );
printf( "%c", s );
return 0;
}
另一种可能性是分配动态内存并将字符串复制到其中。
#include <string.h> // strcpy
#include <malloc.h> // malloc, free
int main(){
const char *str = "a string";
char *arr = malloc( strlen(str ) + 1 );
strcpy( arr, str );
char s = letterAtIndex( arr, 7 );
printf( "%c", s );
free( arr );
return 0;
}
答案 1 :(得分:2)
尝试更改字符串文字是未定义的行为。对于指向字符串文字的变量,请使用类型const char *
,以便编译器在您尝试执行此操作时帮助您发现。
您可以通过以下方式修复代码:
arr
声明为char arr[]