【问题标题】:strcat eccentric behaviorstrcat 古怪行为
【发布时间】:2011-10-28 01:06:28
【问题描述】:

我编写了这个简单的 C 程序,但无法完全弄清楚 strcat 的这种奇怪行为

long sum(long col, char* path, char* path2){

    printf("%s\n",path2);
    strcat(path,".endlines");
    printf("%s\n",path2);
    return 0;
}

int main(int argc, char* argv[]) {
    int n=atoi(argv[1]);
    sum(n,argv[2],argv[3]);
    exit(EXIT_SUCCESS);
}

strcat 应用于 path,但 path2 最终也会被修改。如果有人让我知道发生了什么,我将不胜感激:) 谢谢

运行

./program 3 example/mountdir/location2.csv 例子/rootdir/location2.csv

输出:

example/rootdir/location2.csv

结束线

【问题讨论】:

    标签: c strcat


    【解决方案1】:

    您正在超出缓冲区。原始的 argv[2] 和 argv[3] 在内存中很可能是连续的。当您strcat 到 argv[2] 的末尾时,它正在写入 argv[3] 指向的内存。您需要分配新的缓冲区来保存您尝试创建的较大字符串。

    【讨论】:

    • strncat 在这里没有用,尽管在某些情况下它是有用的。
    • C 有什么机制可以防止这种情况发生吗?我的意思是...例如,我 malloc 2 char* 并且正如您所说,它们有可能以某种方式彼此相邻分配。由于我不知道发生了什么,我是否应该在每次需要 strcat 时将 strcpy 到另一个缓冲区,以确保?这太奇怪了,不是吗?
    • 您有责任了解缓冲区的大小。 strncat 很好,因为您可以限制连接的字符数,这样就不会溢出缓冲区。
    • @NQC,是的,你是对的。总是为它分配新的空间。不,这并不奇怪,这是计算机的工作方式。而 C 让我们详细告诉计算机该做什么。
    【解决方案2】:

    首先,您不能写入 argv[2]。 (这样做会产生依赖于实现或未定义的行为。区别并不重要:不要这样做)。

    第二;混乱在哪里?您可能在 argv[1] 之后立即使用 argv[2] 布置了内存,因此它看起来像“example/mountdir/location2.csv\0example/rootdir/location2.csv”。 argv[ 2 ] (path) 指向第一个“e”,path2 指向空字节后面的“e”。当您 strcat 到路径时,您正在从 \0 开始写入数据,因此 \0 被替换为“。”,“e”被结束线的“e”替换,等等,现在 path2 指向第二个字符串'.endlines'的字符,所以你打印它并得到输出“endlines”。

    【讨论】:

    • 是的,我应该注意到这一点。那些 argv[] 肯定是相邻的
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多