【问题标题】:I need to split a String into 3 parts with different sizes我需要将一个字符串分成 3 个不同大小的部分
【发布时间】:2019-07-05 12:49:58
【问题描述】:

所以,我必须做一个术语表,scanf 将始终读取一个字符和一些文本,第一个字符是我需要执行的操作,例如擦除某些内容、包含或打印。另一部分是我将添加或删除的单词,其余的都是含义。 有时我只会收到用于操作的字符,例如“打印所有”,或者我可以收到类似“e word mean meaning”之类的内容来删除含义,但我也可以收到“e word”并删除相关的单词和含义,因此条目的大小并不总是相同。 入围案例有:

i word meaning
q word
e word
e word meaning
p

带有“含义”的字符串就像“有红色”

我试图用strtok和strcat来拼凑意思,但没有成功,我留下的这段代码只是一个例子,我知道它不起作用

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void){
    char str[] = "a bbbbbbbbbb cccc ccccccccccc cccc"; 
    char* temp; 
    char* rest = str; 
    int i = 0;

    char op[2];

    while ((temp = strtok_r(rest, " ", &rest))){
        printf("%s ", temp);
        if (i>=2){
            strcat(op[2],temp);
        }
        op[i]=temp;
        i++;
    }

    return(0);
}

动作:一个 词:bbbbbbbbbb 意思:cccc ccccccccccc cccc

【问题讨论】:

  • a 是否总是一个字符? bbbbbbbbbb 总是 10 个字符吗?然后很容易只从字符串中复制这些位。特别是如果你记得,例如str 等于 &amp;str[0]
  • 您的规范不完整,因为“拆分”不明确。您需要对“拆分”字符串做什么?
  • @Guerezi 数组 op 没有被初始化所以这个调用 strcat(op[2],temp); (除了它是不正确的)具有未定义的行为。
  • @VladfromMoscow 更不用说索引2 超出范围,或者op[2] 不是字符串。
  • @Someprogrammerdude 我在写评论时也看到了这个。:)

标签: c arrays pointers string.h


【解决方案1】:

如果abbbbbbbbbb不包含空格,调用strtok() 3次:

char str[] = "a bbbbbbbbbb cccc ccccccccccc cccc"; 
char *op[3];  // Changed to char * and increased size

// Note: the last call to strok changes the delimiter
if (NULL != (op[0] = strtok(str, " "))) {
    if (NULL != (op[1] = strtok(NULL, " "))) {
        if (NULL != (op[2] = strtok(NULL, ""))) {
            printf("%s / %s / %s\n", op[0], op[1], op[2]);
        }
   }
}

输出

a / bbbbbbbbbb / cccc ccccccccccc cccc

或者,如果您更喜欢一行:

if ((op[0] = strtok(str, " ")) && (op[1] = strtok(NULL, " ")) && (op[2] = strtok(NULL, ""))) {
    printf("%s / %s / %s\n", op[0], op[1], op[2]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多