C 字符串操作:如何将 =(等号)附加到标记化字符串的开头和结尾,由于按 enter 时换行导致输出错误

C String manipulation: How do I append = (equal sign) to the beginning and end of a tokenized string, Wrong output due to newline upon pressing enter

我目前在将字符串拆分为标记之前和之后附加等号时遇到问题。这让我得出结论,在拆分字符串后,我必须在某个时候用我想要的等号替换换行符。我试过查看 c string.h 库参考,看看是否有办法使用 strstr 替换换行符,看看标记化字符串中是否已经有一个“\n”,但是运行 当我尝试时进入无限循环。我也想过尝试替换换行符,应该是字符串长度减1,我承认,我对C的熟悉程度很低。如果你能看看我的代码,并提供一些反馈,我将不胜感激它。感谢您的时间。我承认我对 C 不太熟悉,但目前正在阅读参考库。

// main method
int main(void){

// allocate memory
char string[256];
char *tokenizedString;
const char delimit[2] = " ";
const char *terminate = "\n";
do{
    // prompt user for a string we will tokenize
    do{
        printf("Enter no more than 65 tokens:\n");
        fgets(string, sizeof(string), stdin);

        // verify input length
        if(strlen(string) > 65 || strlen(string) <= 0) {
            printf("Invalid input. Please try again\n"); }
    } while(strlen(string) > 65);

    // tokenize the string
    tokenizedString = strtok(string, delimit);
    while(tokenizedString != NULL){
        printf("=%s=\n", tokenizedString);
        tokenizedString = strtok(NULL, delimit);
    }
    // replace newline character implicitly made by enter, it seems to be adding my newline character at the end of output
} while(strcmp(string, "\n"));

return 0;
}// end of method main

输出:

Enter no more than most 65 tokens:
i am very tired sadface
=i=
=am=
=very=
=tired=
=sadface
=

期望的输出

Enter no more than 65 tokens:
i am very tired sadface
=i=
=am=
=very=
=tired=
=sadface=

由于您使用的是 strlen(),因此您可以改为这样做

size_t length = strlen(string);
// Check that `length > 0'
string[length - 1] = '[=10=]';

优点:

  1. 这样你只会调用一次strlen()。无论如何,为同一个字符串多次调用它是低效的。

  2. 您总是从输入字符串中删除尾随的 '\n' 以使您的标记化将按预期工作。

注意:strlen() 永远不会 return 一个值 < 0,因为它所做的是计算字符串中的字符数,即"" 只有 0,> 0 否则。

好吧,你有两种方法,最简单的是在标记分隔符字符串中添加一个\n

const char delimit[] = " \n";

(如果要用字符串文字初始化字符串数组,则不需要使用数组大小​​)

所以它消除了你输入的最后一个 \n。另一种方法是在读取时搜索它并将其从输入字符串中删除。您也可以为此目的使用 strtok(3)

tokenizedString = strtok(string, "\n");
tokenizedString = strtok(tokenizedString, delimit);