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/