优化以下代码 char* p = str; int numCount = 0; while (*p != '\0') { if (*p == ',' || *p == '.') { numCount++; } p++; } numCount++; // 数字个数等于分隔符个数加1 *len = numCount; int* nums = (int*)malloc(sizeof(int) * numCount); char *x = strtok(str,",."); int i = 0; while (x!= NULL) { nums[i++] = atoi(x); x = strtok(NULL, ",."); } return nums; }
时间: 2023-12-10 18:05:33 浏览: 111
char* p = str;
int numCount = 1; // 初始化为1,因为最后一个数字后面没有分隔符
while (*p != '\0') {
if (*p == ',' || *p == '.') {
numCount++;
}
p++;
}
*len = numCount;
int* nums = (int*)malloc(sizeof(int) * numCount);
char *x = strtok(str, ",.");
int i = 0;
while (x != NULL) {
nums[i++] = atoi(x);
x = strtok(NULL, ",.");
}
return nums;
```
主要的优化有两点:
1. 在计算数字个数时,初始化为1,因为最后一个数字后面没有分隔符。
2. 在使用 `strtok` 函数时,将分隔符字符串改为 ",.",这样就不需要在循环中判断分隔符是 "," 还是 "." 了。
相关问题
#include <stdio.h> #include <string.h> void strrev(char *p,char *q) { while(p<q) { int t=*p;*p=*q;*q=t; p++;q--; } } int main(int argc, const char *argv[]) { char str[]="good good study"; char *p=str; char *q=str+strlen(str)-1; strrev(p,q); p=q=str; while(*p!='\0') { while(*q!=' '&&*q!='\0') { q++; } char *k=q-1; strrev(p,k); while(*q==' ') q++; q=p; } puts(str); return 0; }
这段代码是用来颠倒字符串中每个单词的序的。它首先定义了一个函数`strrev`,用于颠倒字符串中给定区间的字符顺序然后在`main`函数中,它将字符串"good good study"储在字符数组`str`中。接着它使用指针`p`和`q`分别指向字符串的开头和结尾。
然后,它调用`strrev函数来颠倒整个字符串。接下来,它使用两个指针`p`和`q`来遍历字符串,找到每个单词的起始和结束位置,并调用`strrev`函数来颠倒每个单词的字符顺序。最后,它打印出颠倒后的字符串。
这段代码的输出结果应该是"doog doog yduts",也就是将原字符串中每个单词的顺序颠倒了。
解释一下void remove_blank_lines(char *str){ char *p = str; int count = 0; while (*str != '\0') { if (*str != '\n' && *str != '\r') { *p++ = *str; count++; } else { if (count > 0 && *(p - 1) != '\n') { *p++ = '\n'; } count = 0; } str++; } *p = '\0';}
这段代码是一个函数,函数名为 `remove_blank_lines`,该函数的参数是一个字符指针 `str`,表示需要处理的字符串。
该函数的作用是去除字符串中的空白行,即删除连续出现的多个换行符(`\n`)或回车符(`\r`),只保留一个换行符。
具体实现方法是通过一个指针 `p` 操作原始字符串,将非空白行的字符移动到 `p` 所指向的位置,同时记录非空白行的字符数 `count`。当遇到连续的空白行时,将最后一个换行符保留,并将 `count` 重置为 0。
该函数的具体处理过程如下:
1. 初始化指针 `p` 指向 `str`;
2. 初始化计数器 `count` 为 0;
3. 循环遍历字符串 `str` 直到字符串结尾;
4. 如果当前字符不是换行符或回车符,则表示当前字符是非空白字符,将该字符移动到 `p` 所指向的位置,同时将 `count` 加 1;
5. 如果当前字符是换行符或回车符,则表示当前字符是可能的空白行字符,此时需要根据 `count` 的值进行判断:
1. 如果 `count` 大于 0 并且 `p` 所指向的前一个字符不是换行符,则说明当前位置应该保留一个换行符;
2. 将 `count` 重置为 0;
6. 指针 `str` 向后移动一个字符;
7. 返回处理后的字符串。
注意,该函数对原始字符串进行了修改,因此在调用该函数前需要确保原始字符串可以被修改。如果需要保留原始字符串,可以在调用该函数前先对原始字符串进行备份。
阅读全文