C 字符串修改

标签 c string

所以,我得到了一个包含单词和标点符号的字符串(准确地说是一个完整的句子)。我想改变这句话中的一个词。新单词的字母数量可能与前一个单词的字母数量不完全相同。我还有一个二维矩阵,其中句子的单词现在已更改,因此它具有新单词而不是旧单词。因此,我设法用 * 交换原始字符串中的所有单词,并保留标点符号,以便我可以用更改后的二维矩阵的单词更改 *并保留标点符号。所以我真正的问题是如何用整个单词更改字符串的 * ,然后在需要的地方添加标点符号。

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。

最佳答案

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

  1. 拆分单词,然后将其存储在空格和标点符号上;
  2. 存储到基本堆栈中;
  3. 打印出来并在需要的地方添加空格;
  4. 只要输入单词,就输出单词。

后者用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/

相关文章:

c++ - 如何在特定字节中设置一个值?

c++ - 在 C++ 中传递 C 字符串的问题

c - 字符串数组 : Segmentation fault(core dumped)

Python 字符串 : obtaining what's left after python string slice

Javascript 整数解释为字符串?

在 C 中将字符串转换为 mpz_t

c++ - 从 C、C++ 在 Linux 中发出系统命令

c++ - 客户端-服务器程序,使用 TCP 从客户端向服务器发送消息时出现问题,反之亦然

c++ - 如何在 Pi 上使用 OpenGL ES 在绘制到屏幕之前旋转纹理

java - 通过将字符串拆分为条件子字符串来获取java数组