#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;
}
上述程序中的错误是什么。我只是从每个字符串的两端交换值。
答案 0 :(得分:2)
除其他外,
char *s[]={"To err is human...","But to really mess things up...","One needs to know C!!"};
在这里,您声明并初始化一个指向char的指针数组。这样,每个指针都指向给定的字符串文字。因此,无论你在for
循环中做什么来反转或更改这些字符串都会导致未定义的行为(在这种情况下,UB通常是段错误/崩溃)。
至少将此更改为char s[][100] = {"To err is human...","But to really mess things up...","One needs to know C!!"};
答案 1 :(得分:1)
其中一个错误是你没有包含string.h
所以这不是编译。另一个是你的char*
数组可能会进入一个只读内存区域并修改它会导致奇怪的行为,所以你最好使用:
char s[][255]={"To err is human...",
"But to really mess things up...","One needs to know C!!"};
答案 2 :(得分:0)
作为相关的C FAQ points out:
问:这些初始化之间有什么区别?
char a[] = "string literal"; char *p = "string literal";
如果我尝试为p [i]指定新值,我的程序会崩溃。
答:字符串文字(C源中双引号字符串的正式术语)可以两种略有不同的方式使用:
作为char数组的初始值设定项,如
char a[]
的声明中所述,它指定该数组中字符的初始值(如果需要,还指定其大小)。- 醇>
在其他地方,它变成一个未命名的静态字符数组,这个未命名的数组可能存储在只读存储器中,因此不一定能被修改。在表达式上下文中,数组一如既往地转换为指针(参见第6节),因此第二个声明将p初始化为指向未命名数组的第一个元素。
有些编译器有一个开关控制字符串文字是否可写(用于编译旧代码),有些编译器可能有选项可以将字符串文字正式视为
const char
的数组(为了更好地捕获错误)
有很多方法可以解决这个问题。一种可能性是在reverse_string
函数中使用strdup
,并将其反转。这要求呼叫者承担free
反向字符串的责任。
strdup
不是一个很棒的函数,因为它需要找到正在复制的字符串的长度,这意味着你最终会遍历一个额外的时间。解决这个问题的一种方法是自己分配内存。
#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;
}