所以,我得到一个点,我有一个带有单词和标点符号的字符串(确切地说是一个完整的句子)。我想改变那句话中的一个词。新单词的字母数可能与前一个单词的字母数不完全相同。我还有一个二维矩阵,现在改变了句子的单词,以便它有新单词而不是旧单词。因此,我设法用*
交换原始字符串中的所有单词并保留标点符号,以便我可以使用更改的2-d矩阵的单词更改*
并保留标点符号。所以我真正的问题是如何用整个单词更改字符串的*
,然后在需要的地方添加标点符号。
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
字符串带'*',文字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。
答案 0 :(得分:0)
一些错误:
l1=0;sum3=0;
for (k=0;k<sum2;k++){
if (text3[k]=='*'){
strcpy(&text4[sum3],textb1[l1]);
/*l1++; */ /* You are incrementing the wrong length I think.... */
sum3=sum3+strlen(textb1[l1]);
l1++;
}
else {
text4[sum3]=text3[k];
sum3++;
}
}
text4[sum3] = 0; /* Null terminate */
printf("%s\n",text4);
答案 1 :(得分:0)
这是一个基于我的“堆叠”想法的完整程序,用于演示:
new
字时输出old
字。后者用old
替换每个出现的new
,因为没有指定替换应该只发生一次。为清楚起见,省略了stack
的溢出处理和内存清理。
空格总是连接成一个单独的空间。
可以轻松调整其他方案。
空格总是连接成一个单独的空间。
它仅检查字母数字和基本标点符号集。
处理标点符号非常基本。例如,最初我还将()
添加到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?