我试图在C中编写一段代码,从文件中获取输入(作为字符串),并将其添加到另一个字符串的末尾并打印出来。 该程序在Visual Studio 2013中完美编译,但在运行期间崩溃。 任何人都可以帮我识别代码中的问题。
以下是代码:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
char input[255];
char str1 = "caingb";
char str2 = " ";
FILE *f;
f = fopen("rockyou.txt", "rt");
while (fgets(input, sizeof(input), f))
{
str2 = str1 + input;
printf("%s", str2);
}
fclose(f);
return(0);
}
以下是我收到的三条警告信息:
warning C4047: 'initializing' : 'char' differs in levels of indirection from 'char [7]
warning C4047: 'initializing' : 'char' differs in levels of indirection from 'char [2]
warning C4047: '=' : 'char' differs in levels of indirection from 'char *
答案 0 :(得分:-2)
如果您想在C中连接字符串,则必须使用strcat
。
如果您想将一个字符串复制到另一个字符串,则必须使用strcpy
...
简而言之,对于C中的字符串赋值,您必须使用内置函数(strcpy,strcat,memcpy,snprintf等)。您不能像以前那样简单地使用=
运算符!
所以你的代码会是这样的:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
char input[255];
char *str1 = (char*)malloc(sizeof(char)*10);
strcpy(str1,"caingb");
char *str2=(char)0; //point to null..for initilization!
FILE *f;
f = fopen("rockyou.txt", "rt");
while (fgets(input, sizeof(input), f))
{
str2=(char*)malloc(sizeof(char)*(strlen(str1)+strlen(input))+1);
strcpy(str2,str1);
strcat(str2,input);
printf("%s", str2);
free(str2);
}
fclose(f);
free(str1);
return(0);
}
在上面代码的2行出现malloc函数时,你基本上是在内存上分配空间,以存储malloc从中调用的变量。在你的第二个malloc中,你需要每个字符的大小(sizeof(char)
)乘以字符串1(strlen(str1)
)的长度加上字符串2的长度('strlen(input){ {1}} str2 ). That will give you the required memory in HEAP of your program to store
“caingb”`我6个字符(所以我保留了几个字节......如果你想成为一个好的程序员,这不是一个好策略;-))。稍后通过免费调用,你将使用malloc取消分配你保留的空间,因为如果不这样做,即使程序执行完毕,它也会像这样留在内存中!
一个更抽象的malloc概念(例如用途)将是
. For the first malloc i am just multiplying it by 10, since
...就像你为指针char* string=malloc(15);
分配了15个字节的内存。所以无论这个指针指向什么,都不能超过15个字节,否则你会有内存泄漏(在C中也称为segmantation fault)。
要进一步阅读,请在C中搜索自己的程序堆栈和堆。
也总是通过你的终端(在Linux中)试用手册页。这方面的一个例子是:
char *string
..并且你会得到一个关于malloc的手册页。一开始阅读这些手册可能看起来有点苛刻,但给自己一点时间!在http://man.he.net/
P.S。我没有运行上面的代码,但这就是一般的想法。