- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个函数可以从给定的字符串中去除标点符号,并将其所有内容变为小写:
void stripPunctuators(char *str)
{
int i, j, len = strlen(str);
for (i = 0; i < len; i++)
{
if (!isalpha(str[i]))
{
for (j = i; j < len; j++)
{
str[j] = str[j + 1];
}
len--;
}
str[i] = tolower(str[i]);
}
}
但由于某些原因,当我连续有两个非字母字符时,它会遇到麻烦......这是我的主要功能:
int main(void)
{
char str[50] = "Hello.";
printf("Before strip: %s\n", str);
stripPunctuators(str);
printf("After strip: %s\n", str);
char str2[50] = "Hello.!";
printf("Before strip: %s\n", str2);
stripPunctuators(str2);
printf("After strip: %s\n", str2);
return 0;
}
最后,这是我的输出:
Before strip: Hello.
After strip: hello
Before strip: Hello.!
After strip: hello!
感谢您的帮助!
最佳答案
考虑一个短字符串可能会有所帮助,例如 a!@b
。由于您使用了 for
循环,您的 index 变量将遍历 0..3
值(包括在内)。现在按照顺序:
0123 <- indexes
----
a!@b starting point, index = 0
a!@b index 0 was a, no shift, set index to 1
a@b index 1 was !, shift, set index to 2 ***
a@b index 2 was b, no shift, set index to 3, exit loop
由此,您应该能够看到移动字符串的剩余部分 和 增加索引将导致跳过下一个字符(参见 ***
出错地方的标记)。
您可以通过使用一个循环来解决这个问题,在该循环中,当您进行轮类时索引不会递增(可能使用 while
而不是 for
会是个好主意)。这样,不增加的移位会让您重新检查相同索引,这是下一个字符(由于移位)。
但是,每次要删除一个字符时都对字符串余数进行一次完整移位是相当低效的,因为很有可能您可能需要再次更改这些字符。
你最好使用类似(伪代码)的源和目标指针:
set src and dst to address of first character
while character at src is not end-of-string:
if character at src is not punctuation:
set character at dst to be character at src
increment dst
increment src
set character at dst to be end-of-string
而且,如果你想在 C 中使用它,它会遵循以下行:
void stripPunctuators(char *str) {
char *src = str;
char *dst = str;
while (*src != '\0') {
if (isalpha(*src)) {
*dst = *src; // or combine:
dst++; // "*dst++ = *src"
}
src++;
}
*dst = '\0';
}
Note that I've used
isalpha
in my code simply because that's the one you used in your original code. Since that will strip more than punctuation (digits, for example), you may want to re-examine whether it's the right one to use. Theisalnum
function may be more apt but it also depends on your use case. You may need to preserve spaces as well.Otherwisethingsmaygetverymessyandhardtoread :-)
关于c - 从 Char 数组中删除某些元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51353222/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
当我尝试运行以下代码时,List(.of) 无法编译并给出主题错误。 package collections; import java.util.LinkedHashSet; import java.
我正在尝试编译使用 ChatScript 库的程序。这是我在名为 main.cpp 的文件中的代码: #include #include "common.h" using namespace std
我想在我的程序中外部使用 ChatScript。在documents它说: Embedding Step #1 First, you will need to modify `common.h and
假设我有一个 char,我想用一行代码将其 strcat() 转换为 char 数组。对于 [一个非实用的] 示例: strcat("ljsdflusdfg",getchar()); 或者我想做相反的
我有以下类型签名: *Main Lib> let f :: a -> a -> a -> a; f = undefined *Main Lib> let x :: Char; x = undefin
我正在学习如何在 C 中使用指针(使用 malloc 和 free),但我在这个练习中遇到了一些麻烦。我只想制作一个指针数组,我想在其中保存每个单词的方向。然后我想为一个特定的词做一个 free(),
我有一个字符*: char* version = "10.5.108"; 我想通过字符分隔符获取两个新的 char*。 char delimiter = '.'; 执行以下代码后: printf("|
最近在学习Cpp,今天在学习使用Clion做测试的时候,发生了奇怪的事情。 这是我的代码 int main() { char c = 'b'; char carr[1]{'a'};
我对 c 很陌生,我正在审查一些代码。我遇到了这个: static char * fromDataType; static char * toDataType; static char * fromR
我有一个像这样的动态结构: struct network { int count; char** ips; } 如果我知道每个字符串数组都是 16 个字节(即 INET_ADDRSTR
我有一个旧程序,其中使用了一些库函数,但我没有那个库。 所以我正在使用 C++ 库编写该程序。在那个旧代码中有一些函数是这样调用的 *string = newstrdup("这里有一些字符串"); 字
我正在编写一个函数,该函数接受 ArrayList,然后将每个 char[] 复制到另一个增加长度的 char[] 中,然后将新的 char[] 添加到新的 ArrayList 中。当我尝试复制数组时
我正在寻找 map >并生成每个可能的 map从它。 我知道这可能会占用大量内存并需要一些时间。 每个map需要包含每个字母 a-z,并映射到唯一的 a-z 字符。 IE。啊bjcp迪EVfh嘎血红蛋
#define NAME_LEN 20 #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma warning(disab
所以我必须创建一个函数来找到一对带有第一个字母并返回第二个字母的函数。 我实际上找到了一个答案,但是使用 map 功能却找不到。 lookUp :: Char -> [(Char, Cha
我最近接受采访并要求写mystrcat(*s1, *s2, *s3) 其中s1 和s2 是源字符串连接结果由 s3 给出。有人告诉我,不要担心 s3 的内存分配,并假设 s1 和 s2 不是空/无效字
今天我与一位同事讨论了他(对我来说)不寻常的“main”函数签名。他喜欢这样声明: int main(int argc, char* (*argv)[]) { printf("at index
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: What's the difference between new char[10] and new cha
通常字符串文字是 const char[] 类型。但是当我把它当作其他类型时,我得到了奇怪的结果。 unsigned char *a = "\355\1\23"; 使用此编译器会抛出警告“初始化中的指
我是一名优秀的程序员,十分优秀!