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=]';
优点:
这样你只会调用一次strlen()
。无论如何,为同一个字符串多次调用它是低效的。
您总是从输入字符串中删除尾随的 '\n'
以使您的标记化将按预期工作。
注意:strlen()
永远不会 return 一个值 < 0,因为它所做的是计算字符串中的字符数,即""
只有 0,> 0 否则。
好吧,你有两种方法,最简单的是在标记分隔符字符串中添加一个\n
const char delimit[] = " \n";
(如果要用字符串文字初始化字符串数组,则不需要使用数组大小)
所以它消除了你输入的最后一个 \n
。另一种方法是在读取时搜索它并将其从输入字符串中删除。您也可以为此目的使用 strtok(3)
:
tokenizedString = strtok(string, "\n");
tokenizedString = strtok(tokenizedString, delimit);
我目前在将字符串拆分为标记之前和之后附加等号时遇到问题。这让我得出结论,在拆分字符串后,我必须在某个时候用我想要的等号替换换行符。我试过查看 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=]';
优点:
这样你只会调用一次
strlen()
。无论如何,为同一个字符串多次调用它是低效的。您总是从输入字符串中删除尾随的
'\n'
以使您的标记化将按预期工作。
注意:strlen()
永远不会 return 一个值 < 0,因为它所做的是计算字符串中的字符数,即""
只有 0,> 0 否则。
好吧,你有两种方法,最简单的是在标记分隔符字符串中添加一个\n
const char delimit[] = " \n";
(如果要用字符串文字初始化字符串数组,则不需要使用数组大小)
所以它消除了你输入的最后一个 \n
。另一种方法是在读取时搜索它并将其从输入字符串中删除。您也可以为此目的使用 strtok(3)
:
tokenizedString = strtok(string, "\n");
tokenizedString = strtok(tokenizedString, delimit);