我有一个字符串,我想删除任何 - ,( ,) ,& ,$ ,# ,! ,[ ,] ,{ ,} ," ,' 从单词的开头或结尾
I have a string and I want to remove any - ,( ,) ,& ,$ ,# ,! ,[ ,] ,{ ,} ," ,' from the beginning or end of the word
每个单词都是一个字符串,它们之间没有白色space,因为每个单词都是使用scanf读取的。
如果它在单词之间就忽略那些。
例如:
"..!Hello!!!."
会产生
Hello
和
"??Str'ing!!"
会产生
Str'ing
由于我是初学者,所以我只能使用循环和 C 中的标准 <string.h>
header。
我已经制作了一个辅助函数,它会不断读取每个索引,并且 returns 如果该字符与上面列出的任何一个匹配,则为真。
到目前为止我有这个,但它从整个代码中删除了标点符号,而不仅仅是单词的开头和结尾:
void punc(char *str) {
char *pr = str;
char *pw = str;
while (*pr) {
*pw = *pr++;
pw += (is_punc(*pw) == false);
}
*pw = '[=14=]';
}
一个好的方法是去掉 char 数组前面和后面的所有标点符号,对于这个示例我使用你的指针,沿着 char 数组移动它们直到第一个非-找到标点字符,null 终止它和 return 指向第一个非标点字符的指针:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char *punc(char *str)
{
int iterations = 0;
char *pr = str;
char *pw = &str[strlen(str) - 1]; //pointer to str end
while (ispunct(*pr)) // I'm using ctype.h ispunct() standard function here
{ // You can repalce it by your helper function
pr++;
printf("it%d ", iterations++); //count and print iterations
}
while (ispunct(*pw))
{
if(pw <= pr){ //using pointer comparison to avoid unnecessary iterations
break;
}
pw--;
printf("it%d ", iterations++); //count and print iterations
}
*(pw + 1) = '[=10=]';
return pr;
}
int main()
{
char str1[] = ".[],!hello-.,?!-worl.d.?(!."; //test1
char str2[] = "!.';?"; //test2
char *result1, *result2;
result1 = punc(str1);
printf(" %s\n", result1);
result2 = punc(str2);
printf(" %s\n", result2);
strcpy(str1, result1); //if you want to really replace str with new string
return 0;
}
输出:
it0 it1 it2 it3 it4 it5 it6 it7 it8 it9 hello-.,?!-worl.d
it0 it1 it2 it3 it4
每个单词都是一个字符串,它们之间没有白色space,因为每个单词都是使用scanf读取的。
如果它在单词之间就忽略那些。
例如:
"..!Hello!!!."
会产生
Hello
和
"??Str'ing!!"
会产生
Str'ing
由于我是初学者,所以我只能使用循环和 C 中的标准 <string.h>
header。
我已经制作了一个辅助函数,它会不断读取每个索引,并且 returns 如果该字符与上面列出的任何一个匹配,则为真。
到目前为止我有这个,但它从整个代码中删除了标点符号,而不仅仅是单词的开头和结尾:
void punc(char *str) {
char *pr = str;
char *pw = str;
while (*pr) {
*pw = *pr++;
pw += (is_punc(*pw) == false);
}
*pw = '[=14=]';
}
一个好的方法是去掉 char 数组前面和后面的所有标点符号,对于这个示例我使用你的指针,沿着 char 数组移动它们直到第一个非-找到标点字符,null 终止它和 return 指向第一个非标点字符的指针:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char *punc(char *str)
{
int iterations = 0;
char *pr = str;
char *pw = &str[strlen(str) - 1]; //pointer to str end
while (ispunct(*pr)) // I'm using ctype.h ispunct() standard function here
{ // You can repalce it by your helper function
pr++;
printf("it%d ", iterations++); //count and print iterations
}
while (ispunct(*pw))
{
if(pw <= pr){ //using pointer comparison to avoid unnecessary iterations
break;
}
pw--;
printf("it%d ", iterations++); //count and print iterations
}
*(pw + 1) = '[=10=]';
return pr;
}
int main()
{
char str1[] = ".[],!hello-.,?!-worl.d.?(!."; //test1
char str2[] = "!.';?"; //test2
char *result1, *result2;
result1 = punc(str1);
printf(" %s\n", result1);
result2 = punc(str2);
printf(" %s\n", result2);
strcpy(str1, result1); //if you want to really replace str with new string
return 0;
}
输出:
it0 it1 it2 it3 it4 it5 it6 it7 it8 it9 hello-.,?!-worl.d
it0 it1 it2 it3 it4