【问题标题】:C strings Breaking up a string with multiple '\n' [duplicate]C字符串用多个'\ n'分解一个字符串[重复]
【发布时间】:2017-10-26 14:16:16
【问题描述】:
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”。

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

CCCCCCC

C+

C++

一个

b

c

这是怎么回事?

【问题讨论】:

  • 这里string[i] = '\0'; 试图修改只读内存。所以,行为是未定义的。

标签: c string


【解决方案1】:

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

这一行

 string[i] = '\0';

是罪魁祸首在这里

要获得解决方法,请将 string 设为数组,例如

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

允许修改目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多