所以,我得到了一个包含单词和标点符号的字符串(准确地说是一个完整的句子)。我想改变这句话中的一个词。新单词的字母数量可能与前一个单词的字母数量不完全相同。我还有一个二维矩阵,其中句子的单词现在已更改,因此它具有新单词而不是旧单词。因此,我设法用 *
交换原始字符串中的所有单词,并保留标点符号,以便我可以用更改后的二维矩阵的单词更改 *
并保留标点符号。所以我真正的问题是如何用整个单词更改字符串的 *
,然后在需要的地方添加标点符号。
Example:
Original string: HELLO PEOPLE. HELLO WORLD. HOW ARE YOU TODAY?
Word for change: WORLD --> MAN
String with '*': * *. * *.* * * *?
Result I want: HELLO PEOPLE. HELLO MAN. HOW ARE YOU TODAY?
我尝试了这个(使用带有'*'的text3
字符串和text 4我想要的结果):
l1=0;sum3=0;
for (k=0;k<sum2;k++){
if (text3[k]=='*'){
strcpy(&text4[sum3],textb1[l1]);
l1++;
sum3=sum3+strlen(textb1[l1]);
}
else {
text4[sum3]=text3[k];
sum3++;
}
}
printf("%s\n",text4);
但我只成功打印了第一个 HELLO。
最佳答案
这是一个基于我的“堆栈”想法的完整程序,用于演示:
- 拆分单词,然后将其存储在空格和标点符号上;
- 存储到基本堆栈中;
- 打印出来并在需要的地方添加空格;
- 只要输入
旧
单词,就输出新
单词。
后者用new
替换每一次出现的old
,因为没有指定替换应该只发生一次。为了清楚起见,省略了堆栈
的溢出处理和内存清理。
专业版
空格总是连接成一个空格。
可轻松调整以适应其他场景。
Con
空格总是连接成一个空格。
它仅检查字母数字和基本标点符号集。
标点符号的处理非常基本。例如,最初我也将 ()
添加到 punct
中,但这些需要在插入空格的输出例程中进行进一步调整。例如,如有必要,您可以将 stack
设为一个结构体并添加 spaceAfter
成员并保存原始空格出现的位置。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char *stack[256];
int stack_depth = 0;
const char *punct = ".,:;!?";
int main (int argc, char **argv)
{
char *ptr, *find, *change;
int i;
if (argc != 3)
{
ptr = strrchr (argv[0], '/');
if (!ptr)
ptr = strrchr (argv[0], '\\');
if (ptr)
ptr++;
else
ptr = argv[0];
printf ("usage: %s \"original string\" \"original --> new\"\n", ptr);
return 0;
}
ptr = argv[1];
while (*ptr)
{
while (*ptr == ' ')
ptr++;
i = 0;
while (ptr[i])
{
/* do not store spaces */
if (ptr[i] == ' ')
break;
/* stop on punctuation */
if (strchr (punct, ptr[i]))
break;
i++;
}
if (i)
{
stack[stack_depth] = malloc(i+1);
if (stack[stack_depth] == NULL)
{
printf ("oh wow, out of memory\n");
return -1;
}
strncpy (stack[stack_depth], ptr, i);
stack[stack_depth][i] = 0;
stack_depth++;
ptr += i;
}
if (*ptr && strchr (punct, *ptr))
{
i = 0;
while (ptr[i] && strchr (punct, ptr[i]))
i++;
stack[stack_depth] = malloc(i+1);
if (stack[stack_depth] == NULL)
{
printf ("oh wow, out of memory\n");
return -1;
}
strncpy (stack[stack_depth], ptr, i);
stack[stack_depth][i] = 0;
stack_depth++;
ptr += i;
}
}
printf ("Original string: ");
for (i=0; i<stack_depth; i++)
{
if (i > 0 && !strchr (punct, stack[i][0]))
printf (" ");
printf ("%s", stack[i]);
}
printf ("\n");
/* fetch change words */
ptr = strstr (argv[2], " --> ");
if (!ptr)
{
printf ("bad syntax!\n");
return -1;
}
/* fetch the length of 'find' */
i = ptr-argv[2];
find = malloc (i+1);
strncpy (find, argv[2], i);
find[i] = 0;
/* fetch the length of 'change' */
/* this is the 5 characters ' --> ' after start */
ptr += 5;
i = strlen(ptr);
change = malloc (i+1);
strncpy (change, ptr, i);
change[i] = 0;
printf ("Word for change: %s --> %s\n", find, change);
printf ("Result: ");
for (i=0; i<stack_depth; i++)
{
if (i > 0 && !strchr (punct, stack[i][0]))
printf (" ");
if (strcmp (stack[i], find))
printf ("%s", stack[i]);
else
printf ("%s", change);
}
printf ("\n");
}
测试运行:
replace "HELLO PEOPLE. HELLO WORLD. HOW ARE YOU TODAY?" "WORLD --> MAN"
Original string: HELLO PEOPLE. HELLO WORLD. HOW ARE YOU TODAY?
Word for change: WORLD --> MAN
Result: HELLO PEOPLE. HELLO MAN. HOW ARE YOU TODAY?
关于C 字符串修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23640964/