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

时间:2017-09-19 02:13:42

标签: c string tokenize

我目前在添加等号时遇到问题,在我的字符串被拆分为令牌之前和之后。它让我得出结论,我必须在拆分字符串之后用我想要的等号替换换行符。我已经尝试查看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=

2 个答案:

答案 0 :(得分:2)

由于您使用的是strlen(),因此您可以执行此操作

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

优点:

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

  2. 您始终从输入字符串中删除跟踪'\n',以便您的标记化工作正常运行。

  3. 注意:strlen()永远不会返回值&lt; 0 ,因为它的作用是计算字符串中的字符数,""&gt;只计算0。 0 否则。

答案 1 :(得分:1)

嗯,你有两种方法可以做到,最简单的方法是在令牌分隔符字符串中添加import 'pre.js'; import 'bundle.js'; import 'after.js'

evaluate

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

因此它消除了输入中的最终#include <utility> #include <type_traits> struct matrix {}; struct matrix_add { matrix operator()() const; }; matrix_add operator + (matrix const& a, matrix const& b); template<class T> decltype(auto) evaluate(T&& val) { return std::forward<T>(val); } matrix evaluate(matrix_add const& lazy) { return lazy(); } matrix evaluate(matrix_add & lazy) { return lazy(); } matrix evaluate(matrix_add && lazy) { return lazy(); } int main() { auto a = matrix(); auto b = matrix(); auto c = evaluate(a + b); auto d = evaluate(1 + 2); static_assert(std::is_same<decltype(c), matrix>::value, ""); static_assert(std::is_same<decltype(d), int>::value, ""); } 。另一种方法是在读取时搜索它并从输入字符串中删除它。您也可以将\n用于此目的:

const char delimit[] = " \n";