如何用C语言实现动态的字符串数组
思想:用strlen获得s的长度n,定义一个临时的字符数组temp[],用循环实现把temp[0]=s[n],temp[1]=s[n-1]……
temp[]就是所求得的数组。
什么是动态输入字符串,C语言。是多个输入吗?
在C语言中,字符串是以连续的字节流表示的,并且以 ‘\0’ 结尾,C语言标准库中也提供了很多函数来操作这种形式的字符串,比如,求字符串长度 strlen( ),求子串strstr( ),字符串拷贝strcpy( )等等,但是,这些函数并不安全,很可能给系统或应用程序带来严重的问题,如栈溢出等,C语言字符串中并没有记录操作系统为其分配的长度,用户必须自己将字符串长度保存在其他的变量中,很明显如果操作不当就会产生错误,如臭名昭著的缓冲区溢出。
其他语言中的字符串类型通常在存储字符串本身时也保存了字符串长度,如Pascal,这样做的好处是字符串也可以以空字符’\0’结尾,但也会产生缓冲区溢出错误,本文实现了一个简单的动态字符串库,首先考虑一下,采用什么样的数据结构可以避免缓冲区溢出问题呢,为简化起见,我们定义“字符串”为内存中无类型的字节流,因此可以避开本地化和Unicode等概念,首先定义数据结构如下:
pstr 是指向字符串的指针,str_sz 是字符串长度,而 buf_sz则是包含该字符串的缓冲区长度。
接下来一个问题就是为字符串分配存储空间,由于内存分配可能失效,所以我们需要检查内存分配是否成功,一种可行的方法是在分配函数中返回错误码,但是,这样设计的API不太简洁实用,另外一个可选方案是事先注册一个回调函数,在内存分配失败时再调用该函数,但如果多个客户程序同时申请内存,该方法也会失效,C++中我们可以使用异常来处理这种情况,但是 C 不支持异常,所以该方法也不太现实。其实,某些其他的标准库代码也有类似的问题,如数学库中某个函数对一个负数进行求根运算,返回结果本来是double,为了表明函数调用出错,我们可以让函数返回NaN(Not a Number),因此程序在需要检查该函数调用是否出错时可以检查返回值。
(C语言)如何将char**作为字符串数组,并且动态地添加字符串到其中?
#include stdio.h
#include stdlib.h
// 每行最多有多少个字符
#define LINE_MAX_CHARS 200
int main()
{
FILE *fp;
int i = 0, j;
char **lines = new char*;
if ((fp = fopen(“E:/example.txt”, “r”)) == NULL)
{
perror(“File open error!\n”);
exit(1);
}
lines[i] = new char;
while ((fgets(lines[i], LINE_MAX_CHARS, fp)) != NULL)
{
++i;
lines[i] = new char;
}
for (j = 0; j i; ++j) {
printf(“%s”, lines[j]);
}
return 0;
}
C语言:二维动态字符串数组问题
第一个问题:你用gets()时,在输入倒数第二个字符串结束时是不是输入了一个“回车”或“空格”确认输入的内容?此时gets()将这个“回车”或空格作为你输入的最后一个字符串赋给变量了。
第二个问题:
free()函数释放动态分配的内存空间;
c语言中怎么动态分配一个字符串数组
#includestdio.h
#includestdlib.h
#define LENGTH 20
int main()
{
int str_num;
scanf(“%d”,str_num);
char (*str_arr)[LENGTH] = (char(*)[LENGTH])malloc(sizeof(char)*LENGTH*str_num);
for(int i=0;istr_num;i++)
{
scanf(“%s”,str_arr[i]);
}
}