gpt4 book ai didi

C 从字符串的前 15 个字符中获取完整的单词

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:34 25 4
gpt4 key购买 nike

我有一个函数可以返回字符串的前 13 个字符或字符串的后 13 个字符:

char* get_headsign_text(char* string, int position) {
if (position == 1){
char* myString = malloc(13);
strncpy(myString, string, 13);
myString[13] = '\0'; //null terminate destination
return myString;
free(myString);
} else {
char* myString = malloc(13);
string += 13;
strncpy(myString, string, 13);
myString[13] = '\0'; //null terminate destination
return myString;
free(myString);
}
}

我想要它,以便该函数只返回完整的单词(而不是中间截断的单词)。

例子:如果字符串是“嗨,我是克里斯托弗”

get_headsign_text(string, 1) = "Hi I'm "
get_headsign_text(string, 2) = "Christopher"

因此,如果该函数会在一个单词内剪切,它会在最后一个单词之前剪切,如果是这样,如果它试图获取第二个 13,它会包括本应被剪切的单词。

最佳答案

当考虑到各种边缘情况时,代码的结构需要进行相当大的更改。

例如:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

inline int min_int(int a, int b) {
return a < b ? a : b;
}

inline int is_word_char(char c) {
return isgraph(c);
}

char* get_headsign_text(char* string, int position) {
int start_index, end_index;
if (position == 1) {
start_index = 0;
} else {
start_index = 13;
}
end_index = min_int(strlen(string) + 1, start_index + 13);
start_index = min_int(start_index, end_index);
int was_word_char = 1;
while(start_index > 0 && (was_word_char = is_word_char(string[start_index]))) {
--start_index;
}
if(!was_word_char) {
++start_index;
}
while(end_index > start_index && is_word_char(string[end_index])) {
--end_index;
}
int myStringLen = end_index - start_index;
char *myString = malloc(myStringLen + 1);
strncpy(myString, string + start_index, myStringLen);
myString[myStringLen] = '\0';
return myString;
}

int main(void) {
char s[] = "Hi, I\'m Christopher";
char *r1 = get_headsign_text(s, 1);
char *r2 = get_headsign_text(s, 2);
printf("<%s>\n<%s>\n", r1, r2);
free(r1);
free(r2);
return 0;
}

也就是说,您发布的代码片段还有许多其他问题/疑虑:

  • 在赋值 myString[13] = '\0'; 中,您正在分配给尚未分配的内存。虽然您已经分配了 13 个字节,但 myString[13] 指的是最后一个分配字节之后的一个字节。
  • return 语句执行后没有任何内容,并且永远不会调用 free
  • 你不应该为了立即释放它而返回一 block 内存!给来电者一些东西只是为了拿走它是非常适得其反的。 :)
  • 您没有验证字符串的大小。除非你绝对确定这只会在足够长的字符串上调用,否则当 position2 并且你的字符串缓冲区只是,比如, 10 字节长。

关于C 从字符串的前 15 个字符中获取完整的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31363625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com