c - 简单字符串连接的问题

标签 c

<分区>

Possible Duplicate:
Why do I get a segmentation fault when writing to a string?

我正在编写一个非常简单的程序,我试图在 for 循环中连接两个字符串。字符串连接中的第一个字符串是固定的,第二个字符串是使用itoa 函数获得的。该程序正在成功构建,但是当我尝试运行该程序时,它无法运行并停止。我刚刚调试了程序,在调试时我意识到程序卡在了字符串连接操作中。我在下面发布程序。感谢大家的支持:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char *str="NULL" ,dec[] = "NULL";
    int i,num;

    printf("Enter a number : \n");
    scanf("%d",&num);

    for (i=0;i<num;i++)
    {   str = "test_file_num_"; 
        itoa(i,dec,10);
        strcat(str,dec);
         printf("%s\n",str);
    }
 return 0;
}

最佳答案

写入 str 是错误的,它的内存不可写。当你为初学者做这个 char *str="NULL" 时,你只是分配了 5 个字节(当你开始连接时你需要更多),而且你也在只读内存上做这件事(可能是在 .data 上或可能在 .text 上),在某些情况下它会起作用,但它是未定义的行为。

如果你不能使用动态内存尝试做这样的事情:

char str[128]="NULL"

这会在堆栈上分配 128 个字节(您可能需要更多)。这不是最好的方法,但它是可以解决您的问题的最小更改。

编辑:

这一行同样的问题 str = "test_file_num_"; 它将 str 指向驻留在只读内存中的字符串文字。为此更改它:

strcpy(str, "test_file_num_");

这会将字符串文字复制到堆栈分配的缓冲区。

最后,我认为您应该将循环内的所有代码简单地替换为:

printf("test_file_num_%d\n", i);

关于c - 简单字符串连接的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14328453/

相关文章:

c - 是否可以交换两个变量的地址?

c++ - 我在哪里可以学习有关C++编译器的 “what I need to know”?

c++ - 跨文件 #if 和 #endif - 应该合法吗?

c# - 如何使选项卡控件上的选项卡消失?

c - 打印哈希表

c - 我的程序在扫描完成之前开始循环

c - 如何在 c 中声明具有非常量值的二维数组?

c - 表达式 ( arr[i+1] - arr[i] ) 如何产生与索引差相同的十进制数?

在 C 中创建和初始化用户定义类型的数组

c - 在 C 中打印字符串