C字符串更改

时间:2014-05-13 20:27:49

标签: c string

所以,我得到一个点,我有一个带有单词和标点符号的字符串(确切地说是一个完整的句子)。我想改变那句话中的一个词。新单词的字母数可能与前一个单词的字母数不完全相同。我还有一个二维矩阵,现在改变了句子的单词,以便它有新单词而不是旧单词。因此,我设法用*交换原始字符串中的所有单词并保留标点符号,以便我可以使用更改的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。

2 个答案:

答案 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)

这是一个基于我的“堆叠”想法的完整程序,用于演示:

  1. 拆分然后在空格和标点符号上存储单词;
  2. 存入基本堆栈;
  3. 在需要的地方打印出空格;
  4. 输入new字时输出old字。
  5. 后者用old替换每个出现的new,因为没有指定替换应该只发生一次。为清楚起见,省略了stack的溢出处理和内存清理。

    空格总是连接成一个单独的空间。

    可以轻松调整其他方案。

    N

    空格总是连接成一个单独的空间。

    它仅检查字母数字和基本标点符号集。

    处理标点符号非常基本。例如,最初我还将()添加到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?