Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将字符数组复制到数组的元素_C_Arrays_String - Fatal编程技术网

C 将字符数组复制到数组的元素

C 将字符数组复制到数组的元素,c,arrays,string,C,Arrays,String,我一直在编写一个函数,用于提取每两个换行符之间的信息。在将字符数组“data”复制到“info”数组的元素时,我遇到了一个问题 #include <stdio.h> #include <string.h> void query_db(); char buffer[100]="+HTTPREAD:86\nUdara\nNO\n+94123456789\nOK"; volatile int buffer_pointer; char info[3][20]; int ma

我一直在编写一个函数,用于提取每两个换行符之间的信息。在将字符数组“data”复制到“info”数组的元素时,我遇到了一个问题

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

void query_db();

char buffer[100]="+HTTPREAD:86\nUdara\nNO\n+94123456789\nOK";
volatile int buffer_pointer;
char info[3][20];

int main()
{
    query_db();
    return 0;
}

void query_db(){
    unsigned char j=0,start,end,amount;
    char data[20];
    buffer_pointer = 0;
    while( buffer_pointer < strlen(buffer)){
        if(buffer[buffer_pointer] == 10){
            if(j==0){
               start = buffer_pointer+1;
               printf("headstart = %u\n",start);
            }
            else{
                printf("\n%u start = %u\n",j,start);
                end = buffer_pointer;
                amount = end - start;
                strncpy(data, buffer+start,amount);
                memcpy(info[j-1],data,strlen(data));//need help in this line
                printf("data = %s\n",info[j-1][20]);
                memset(data,0,20);
                start = end+1;
                printf("%u end = %u\n",j,end);
            }
            j++;
        }
        buffer_pointer++;
    }
}
首选输出:

headstart = 13

1 start = 13
data = Udara
1 end = 18

2 start = 19
data = NO
2 end = 21

3 start = 22
data = +94123456789
3 end = 34

错误输出的问题在于:

printf("data = %s\n",info[j-1][20]);
您可以使用
“%s”
格式打印字符串,但是
info[j-1][20]
是单个
字符。而且这也是不允许的


您可能打算使用
info[j-1]

注意,在某些情况下,will not null会终止目标字符串。如果发生这种情况,那么使用
strlen(data)
将导致无参数函数的原型:即
void query_db()在两个参数之间应有一个
void
。否则,编译器将生成可以接受任何数量的参数的代码,这些参数表示原型是<代码>作废查询数据库(作废)编译时,始终启用警告,然后修复这些警告。(对于
gcc
,至少使用:
-Wall-Wextra-Wconversion-pedantic-std=gnu11
)注意:其他编译器使用不同的选项生成相同的内容取决于在哪个操作系统上运行,此语句:
if(buffer[buffer\u pointer]==10){
可能永远不会为“真”建议使用:
if(buffer[buffer\u pointer]=='\n'){
关于:
而(buffer\u pointer
变量
buffer\u pointer
,(实际上是缓冲区的索引,而不是指针)正在比较
int
size\u t
(a
size\u t
是一个
长无符号int
。你的编译器应该告诉你这个问题,在这里:
strncpy(数据,缓冲区+开始,数量);
,它不会在末尾添加空字符。稍微解释一下就可以很好地适应这个“答案”。
memcpy((char *)&info[j-1],data,strlen(data));
memcpy((char *)&info[j-1],data,strlen(data));