C字符串用多个 '\n'分解一个字符串

标签 c string

int main(void){
char* line = "CCCCCCC\nC+\nC++";
char* line2 = "a\nb\nc";
//char* pattern = ".\\+\\+";
//int n= strlengp(line);
printf("%s\n", line);
printf("%s\n", line2);
fputs(line, stdout);

此代码正确打印: 中交会

C+

C++

一个

b

c

现在我的问题是这样的,我正在研究没有 string.h 实现的 rgrep 函数。 以下是我正在处理的代码的主要内容,我不会对其进行修改。

int main(int argc, char **argv) {
   if (argc != 2) {
        fprintf(stderr, "Usage: %s <PATTERN>\n", argv[0]);
        return 2;
    }

    /* we're not going to worry about long lines */
    char buf[MAXSIZE];

    while (!feof(stdin) && !ferror(stdin)) {
        if (!fgets(buf, sizeof(buf), stdin)) {
            break;
       }
       if (rgrep_matches(buf, argv[1])) {
           fputs(buf, stdout);
           fflush(stdout);
       }
   }

    if(ferror(stdin)) {
       perror(argv[0]);
       return 1;
   }

   return 0;
}

int rgrep_matches(char *line, char *pattern){
   printf("%s", line);
   return 0;
}

现在,当我在包含与上述代码“CCCCCCC\nC+\nC++”、“a\nb\nc”相同的字符串的测试测试文件上运行上述代码时。

为什么上面的代码会输出:

CCCCCCC\nC+\nC++

a\nb\nc

显然忽略了“\n”。

当打印在页面顶部发布的不同文件中构建的测试代码时:

CCCCCCCC

C+

C++

一个

b

c

这是怎么回事?

最佳答案

这会导致undefined behavior ,因为您尝试写入不可修改的内存!!

这一行

 string[i] = '\0';

罪魁祸首就是这里

要获得解决方法,请将字符串设置为数组,例如

char string[] = "a\nb\nc";

允许修改目标。

关于C字符串用多个 '\n'分解一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46956738/

相关文章:

c - 海湾合作委员会 4.8.1 : combining c code with c++11 code

我可以假设以较小的大小调用 realloc 将释放剩余部分吗?

c++ - 函数调用上下文中的字符指针、字符数组和字符串

javascript - 是否可以在文本区域中索引输入的文本?

swift - 如何在 Swift 中从字符串中删除数字

c++ - 为什么 libclang 会错误解析带有 .h 前缀的 C++ header ?

c - 如何用指向存储在另一个数组中的字符串的指针填充字符指针数组?

C、读取二进制文件?

javascript - 如何检查字符串是否包含 JavaScript 中的特定单词

c# - 获取子字符串 - 特定字符之前的所有内容