我在代码中得到一个错误,我不知道它是什么意思,这是我第一次遇到它。
AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: SEGV on unknown address 0xffffffffffffffbe (pc 0x7f3dfc3c588c bp 0x7ffe82c73070 sp 0x7ffe82c727d0 T0)
==30==The signal is caused by a READ memory access.
#0 0x7f3dfc3c588b (/lib/x86_64-linux-gnu/libasan.so.5+0xd688b)
#3 0x7f3dfb7b70b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/lib/x86_64-linux-gnu/libasan.so.5+0xd688b)
==30==ABORTING
我需要把一行中的每个单词都反转过来。我认为这发生在第二个循环中。我的想法是找到每个单词的第一个和最后一个索引。这是我的代码:
char * reverseWords(char * s){
int n = strlen(s);
char *res = malloc(sizeof(char) * n);
int firstI, lastI;
for (int i = 0; i < n; i++){
firstI = i;
while (++i < n && strcmp(res[i], ' ') == 0){
lastI = i - 1;
}
while (firstI > lastI){
char temp = res[firstI];
res[firstI++] = res[lastI];
res[lastI--] = temp;
}
}
return res;
}
新码
char * reverseWords(char * s){
int n = strlen(s);
char *res = malloc(n + 1);
strcpy(res, s);
int firstI, lastI;
for (int i = 0; i < n; i++){
firstI = i;
while (++i < n && res[i] == ' '){
lastI = i - 1;
}
while (firstI > lastI){
char temp = res[firstI];
res[firstI++] = res[lastI];
res[lastI--] = temp;
}
}
return res;
}
1条答案
按热度按时间djmepvbi1#
因一个错误而关闭:
strlen()
不计算终止空字节。您没有为其分配空间。缺少空终止符:
在返回之前,不能以null终止
res
。strcmp()比较字符串:
strcmp()
的参数必须是char *
s,而不是char
s。旁白:如果
malloc()
返回NULL
,则代码将面临未定义行为的风险。编辑:当前代码太复杂了。我简化了一些东西,并添加了一些检查。
示例I/O: