如何将标记附加到C中的字符串变量?

所以我有以下代码:

//Get the line

fgets(line,MAX,stdin);

//Remove trailing new line character

line[strcspn(line,"\r\n")] = 0;

//Count number of tokens

int tokenCounter = 1;
for (int i = 0; i < strlen(line); i++){
    if (line[i] == ' '){
        tokenCounter++;
    }
}if (tokenCounter >= 3){
    command = strtok(line," ");
    id = strtok(NULL," ");
    name = strtok(NULL," ");
    if (tokenCounter > 3){
        for (char *p = strtok(NULL," "); p != NULL; p = strtok(NULL," ")){
            strcat(name,p);
        }
    }
    printf("Command: %s -- ID: %s -- Name: %s\n",command,id,name);
}

该代码应该执行的操作是将行中的第一个单词保存在“ command”变量中,将行中的第二个单词保存在“ id”变量中,并将其余单词保存在一个单词中变量称为“名称”。但目前其无法正常工作。其工作原理如下:

Input  >  word1 word2 word3
Output >  Command: word1 -- ID: word2 -- Name: word3

Input  >  word1 word2 word3 word4
Output >  Illegal Instruction: 4

正确的输出应该如下:

Input  >  word1 word2 word3
Output >  Command: word1 -- ID: word2 -- Name: word3

Input  >  word1 word2 word3 word4
Output >  Command: word1 -- ID: word2 -- Name: word3 word 4

我在循环中做错什么了吗?如果是,可以更改什么?

timeyy 回答:如何将标记附加到C中的字符串变量?

不完整的代码可能有很多问题,但是一个明显的问题是循环:

for (int i = 3; i <= tokenCounter; i++){
    name = strtok(NULL," ");
    if (tokenCounter > 3)
        strcat(name,strtok(NULL," "));
}

第一次通过循环,这会将name分配为指向扫描缓冲区的指针,如果namechar name[MAX];,则该指针将不起作用(任何情况下都必须如此)代码有工作的希望),因此您应该会看到编译错误。然后,strtok在到达输入结尾时返回NULL,当您将其传递给strcat时可能会导致立即崩溃。您需要的更像是

    name = strcpy(strtok(NULL," "));
    while (char *tmp = strtok(NULL," ")) {
        strcat(name," ");
        strcat(name,tmp);;
    }

这不是很好,因为它不检查缓冲区溢出,而只是拆分一个重组令牌,那么为什么要打扰呢?只需使用strtok(NULL,"\n");即可将整个行的其余部分作为一个单独的“令牌”。


如果您错误地声明了char *name;,则可能是导致崩溃的原因。当你做

name = strtok(NULL," ");
if (tokenCounter > 3){
    for (char *p = strtok(NULL," "); p != NULL; p = strtok(NULL," ")){
        strcat(name,p);

第一行使name指向strtok缓冲区,然后在循环中尝试将缓冲区的一部分附加到自身,这将导致未定义的行为。

本文链接:https://www.f2er.com/3127187.html

大家都在问