我需要在C中编写一个获取“ char * str”的函数(void),该字符串包含定界符(char *定界符=“?:,-space”)。该功能需要更新字符串本身,以便最长的单词将以大写字母书写。
到目前为止,这是我的代码:
void
longestInCaptital(char *str)
{
char *delimiters = "?:,- ";
char copyOfStr[strlen(str)];
strcpy(copyOfStr, str);
char *temp = strtok(copyOfStr, delimiters);
int maxLetters = 0;
char *tempIndex;
while (temp) {
if (strlen(temp) > maxLetters) {
maxLetters = strlen(temp);
tempIndex = temp;
}
temp = strtok(NULL, delimiters);
}
str = tempIndex;
int i;
for (i = 0; i < maxLetters; i++) {
str[i] = toupper(str[i]);
}
}
我试图使它工作,但是不能, 谢谢你的帮手!
答案 0 :(得分:1)
使用strtok的strspn / strcspn可能更容易做到这一点,因为您要在适当的位置更新字符串并且不想在其上全部写NUL:
void longestInCaptital(char *str) {
char *delimiters = "?:,- ";
char *longest = 0;
size_t longest_len = 0, len;
while (*str) {
str += strspn(str, delimiters); // skip any initial delimiter
len = strcspn(str, delimiters); // how long is this word?
if (len > longest_len) {
longest = str;
longest_len = len; }
str += len };
while (longest_len-- > 0) {
*longest = toupper(*longest);
++longest; }
}
strspn
为您提供了所传递的字符集中字符串开头的字符数。 strcpsn
为您提供不在集合中的号码。
答案 1 :(得分:0)
您非常接近。您只需要将副本中最大字符串开头的 offset 应用于原始的地址。
另外,请注意,copyOfStr
必须为+1
才能说明EOS字符。
注意:我未对此进行了测试:
void
longestInCaptital(char *str)
{
char *delimiters = "?:,- ";
char copyOfStr[strlen(str) + 1];
strcpy(copyOfStr, str);
int maxLetters = 0;
char *tempIndex = NULL;
char *temp = strtok(copyOfStr, delimiters);
while (temp) {
int curlen = strlen(temp);
if (curlen > maxLetters) {
maxLetters = curlen;
tempIndex = temp;
}
temp = strtok(NULL, delimiters);
}
int i;
// get starting offset within _original_ string
str += (tempIndex - copyOfStr);
for (i = 0; i < maxLetters; i++) {
str[i] = toupper(str[i]);
}
}