反向字符串 #包括 #包括 int main() { char*s[]={“犯错是人的…”,“但要真正把事情搞砸…”,“需要知道C!!”; int i,j,len,t; 对于(i=0;i
嗯,其中一个错误是您没有包含反向字符串 #包括 #包括 int main() { char*s[]={“犯错是人的…”,“但要真正把事情搞砸…”,“需要知道C!!”; int i,j,len,t; 对于(i=0;i,c,string,C,String,嗯,其中一个错误是您没有包含string.h,因此这不是编译。另一个错误是您的char*数组可能会进入只读内存区域,修改它会导致奇怪的行为,因此您最好使用: #include <stdio.h> #include <stdlib.h> int main() { char *s[]={"To err is human...","But to really mess things up...","One needs to know C!!"}; int i,
string.h
,因此这不是编译。另一个错误是您的char*
数组可能会进入只读内存区域,修改它会导致奇怪的行为,因此您最好使用:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *s[]={"To err is human...","But to really mess things up...","One needs to know C!!"};
int i,j,len,t;
for(i=0;i<=2;i++)
{
len=strlen(s[i]);
for(j=0;j<len/2;j++)
{
t=*(s[i]+len-1-j);
*(s[i]+len-1-j)=*(s[i]+j);
*(s[i]+j)=t;
}
}
for(i=0;i<=2;i++)
printf("%s\n",s[i]);
return 0;
}
除其他外
char*s[]={“犯错是人的…”,“但要把事情搞砸…”,“需要知道C!!”};
这里声明并初始化一个指向char的指针数组。这样每个指针都指向一个给定的字符串文字。因此,无论您在
for
循环中执行什么操作来反转或更改这些字符串,都会导致未定义的行为(在这种情况下,UB通常是segfault/crash)
至少将此更改为chars[][100]={“犯错是人的…”,“但要真正把事情搞砸…”,“你需要知道C!!”};
作为相关的C常见问题解答:
问:这些初始化之间有什么区别
char s[][255]={"To err is human...",
"But to really mess things up...","One needs to know C!!"};
如果我试图给p[I]赋值,我的程序就会崩溃
答:字符串文字(C源代码中双引号字符串的正式术语)可以用两种稍有不同的方式使用:
char a[]
的声明中,它指定该数组中字符的初始值(如有必要,还指定其大小)
const char
的数组(以便更好地捕捉错误)
有很多方法可以解决这个问题。一种可能是在reverse_string
函数中使用,并将其反转。这需要调用方负责重新生成反转的字符串
strdup
不是一个很好的函数,因为它需要找到要复制的字符串的长度,这意味着您需要额外遍历一次。解决这个问题的一种方法是自己分配内存
char a[] = "string literal";
char *p = "string literal";
#包括
#包括
#包括
煤焦*
反向字符串(常量字符*s){
字符*光标;
字符*反转;
尺寸与长度;
如果(!s){
返回NULL;
}
长度=strlen(s);
反向=malloc(长度+1);
如果(!反向){
返回NULL;
}
如果(!长度){
*反向='\0';
反向返回;
}
光标=反向;
while(长度--){
*(光标++)=*(s+长度);
}
*游标='\0';
反向返回;
}
内部主(空)
{
int i;
char*s[]={
“犯错是人的……”,
“但要真的把事情搞砸……”,
“一个人需要知道C!!”
};
对于(i=0;i
您有问题吗?s是一个只读字符串数组。请尝试char s[][100]
char*s[]={(char[]){“犯错是人类的…”,(char[]{“但要真正把事情搞砸…”,(char[]){“需要知道C!!”};
为什么@WilliamPursell@NamanSharma请参阅C常见问题解答:您应该至少阅读一次整个常见问题解答。了解其中的内容非常有用。“因此,无论您在for循环中做什么,都可以反转或更改这些字符串”-->未定义的行为。Seg错误是一种常见的可能性,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *
reverse_string(const char *s) {
char *cursor;
char *reversed;
size_t length;
if (!s) {
return NULL;
}
length = strlen(s);
reversed = malloc( length + 1 );
if (!reversed) {
return NULL;
}
if ( !length ) {
*reversed = '\0';
return reversed;
}
cursor = reversed;
while (length--) {
*(cursor++) = *(s + length);
}
*cursor = '\0';
return reversed;
}
int main(void)
{
int i;
char *s[] = {
"To err is human...",
"But to really mess things up...",
"One needs to know C!!"
};
for (i = 0; i < sizeof(s)/sizeof(s[0]); ++i) {
char *reversed = reverse_string( s[i] );
puts( reversed );
free( reversed );
}
return 0;
}