我正在尝试将字符串的某些部分复制到其他新字符串中,但是当我尝试执行此操作并打印结果时,它会给我一些奇怪的输出。我真的希望有人可以提供帮助。我有一种感觉,它是缺少指针的东西。这是我的来源;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getData(char code[], char ware[], char prod[], char qual[])
{
printf("Bar code: %s\n", code);
/* Copy warehouse name from barcode */
strncpy(ware, &code[0], 3);
ware[4] = "\0";
strncpy(prod, &code[3], 4);
prod[5] = "\0";
strncpy(qual, &code[7], 3);
qual[4] = "\0";
}
int main(){
/* allocate and initialize strings */
char barcode[] = "ATL1203S14";
char warehouse[4];
char product[5];
char qualifier[4];
getData(&barcode, &warehouse, &product, &qualifier);
/* print it */
printf("Warehouse: %s\nID: %s\nQualifier: %s", warehouse, product, qualifier);
return 0;
}
编辑:
奇怪的输出是:
Bar code: ATL1203S14
Warehouse: ATL
ID: ♫203(♫>
Qualifier: S14u♫203(♫>
答案 0 :(得分:6)
我认为您的意思是'\0'
而不是"\0"
和3
而不是4
:
ware[4] = "\0";
尝试:
ware[3] = 0;
&
中的getData(&barcode, &warehouse...)
也没用。只需使用getData(barcode, warehouse...);
。
答案 1 :(得分:2)
你在getData()函数中写过字符的结尾。你已经定义了char product[5]
,它分配了5个字节的内存。这给你数组索引0,1,2,3,4。在getData中,将产品的null终止符写入索引5,该索引将超过产品的末尾,并将覆盖下一个var的第一个字符。
同样适用于裸码,仓库和限定符。
答案 2 :(得分:1)
C和C ++中的数组是从零开始的。最后一个索引比长度少一个。您在数组后的内存中为每个数组ware, prod
和qual
设置了一个值。
例如,而不是
char warehouse[4];
ware[4] = "\0";
你想要:
char warehouse[4];
ware[3] = "\0";
答案 3 :(得分:0)
getData(&barcode, &warehouse, &product, &qualifier);
这不是您应该致电getData
的方式。 getData
接受指针,数组自动转换为指针,因此不需要使用地址运算符&
。
你应该使用
getData(barcode, warehouse, product, qualifier);
答案 4 :(得分:0)
main()内的字符串大小不包括标记的位置。
你需要:
char warehouse[5];
char product[6];
char qualifier[5];
此外,您正在将一个指向字符串“\ 0”的指针指定给一个字符,您应该在其中指定字符'\ 0'本身。
答案 5 :(得分:0)
我想我的做法有点不同。特别是,strncpy
几乎从未真正有用(我有理由相信它是为原始Unix FS中的文件名而发明的,虽然它非常符合他们的特定要求,但这些要求非常不寻常,以至于其他任何东西都很少有好处。)
相反,我会使用sscanf:sscanf(code, "%4c%5c%4c", ware, prod, qual);
您的问题不明确这是否真的正确无误。正如其他人所指出的那样,你写的是你已经分配的空间的末尾。上面,我假设您指定了要复制的字符数,因此您必须将每个分配扩展一个字符,以便为终结符腾出空间。或者,如果您已经为终结器留出了空间并且希望复制的字符少一个,那么您必须将每个长度减少一个,因此格式字符串将是“%3c%4c%3c”。