我正在编写一个程序,它将文件中的每3个数字转换为ASCII符号。所以我想我可以将数字读入字符数组,然后在第二个数组中将每个3个元素作为1个元素,将它们转换为int,然后将它们打印为char。
但是,我仍然坚持每3个元素。这是此部分的代码片段:char arry[] = "073102109109112"; <--example string read from a file
char arryNew[16] = {0};
for(int i = 0; i <= sizeof(arryNew); i++){
strncpy(arryNew, arry, 3);
arryNew[i+3]='\0';
puts(arryNew);
}
这段代码给我的是前三个数字,十五次。我已经尝试将i递增3,这给了我前3个数字5次。如何用strncpy写一个for循环,这样在复制n个字符后,它会移到下一个n个字符?
答案 0 :(得分:1)
您始终将指针传递给数组的开头,因此您当然总会得到相同的结果。您必须包含循环计数器才能进入下一个块:
strncpy(arryNew, &arry[i*3], 3);
这里有一个问题:
arryNew[i+3]='\0';
首先,您不需要每次都设置空字节,因为这无论如何都不会改变。此外,您将损坏内存,因为您使用i+3
作为索引,因此当您达到14和15时,它将写入数据边界之外。
您的arrayNew
必须更长,因为您的原始数组是16个字符,而您的目标数组也是。如果你打算在那里有几个3char字符串,那么你的目标必须有5 * 4个字符,因为每个字符串也有0字节。
当然,你也必须在这里使用索引。现在它的编写方式,当i
达到14和15时,它将超出数组边界。
所以你似乎想要做的事情(不清楚你的描述)是:
char arry[] = "073102109109112"; <--example string read from a file
char arryNew[20] = {0};
for(int i = 0; i <= sizeof(arry); i++)
{
strncpy(&arryNew[i*4], &arry[i*3], 3);
puts(&arryNew[i*4]);
}
或者,如果您只想打印单个字符串,那么您可以这样做:
char arry[] = "073102109109112"; <--example string read from a file
char arryNew[4] = {0};
for(int i = 0; i <= sizeof(arry); i++)
{
strncpy(arryNew, &arry[i*3], 3);
puts(arryNew);
}
答案 1 :(得分:0)
有些问题。
// Need to change a 3 chars, as text, into an integer.
arryNew[i] = (char) strtol(buf, &endptr, 10);
// char arryNew[16] = {0};
// Overly large.
arryNew[6]
// for(int i = 0; i <= sizeof(arryNew); i++){
// Indexing too far. Should be `i <= (sizeof(arryNew) - 2)` or ...
for (i=0; i<arryNewLen; i++) {
// strncpy(arryNew, arry, 3);
// strncpy() can be used, but we know the length of source and destination,
// simpler to use memcpy()
// strncpy(buf, a, sizeof buf - 1);
memcpy(buf, arry, N);
// arryNew[i+3]='\0';
// Toward the loop's end, code is writing outside arryNew.
// Lets append the `\0` after the for() loop.
// int i
size_t i; // Better to use size_t (or ssize_t) for array index.
建议:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char Source[] = "073102109109112"; // example string read from a file
const int TIW = 3; // textual integer width
// Avoid sprinkling bare constants about code. Define in 1 place instead.
const char *arry = Source;
size_t arryLen = strlen(arry);
if (arryLen%TIW != 0) return -1; // is it a strange sized arry?
size_t arryNewLen = arryLen/TIW;
char arryNew[arryNewLen + 1];
size_t i;
for (i=0; i<arryNewLen; i++) {
char buf[TIW + 1];
// strncpy(buf, a, sizeof buf - 1);
memcpy(buf, arry, TIW);
buf[TIW] = '\0';
char *endptr; // Useful should OP want to do error checking
// TBD: test if result is 0 to 255
arryNew[i] = (char) strtol(buf, &endptr, 10);
arry += TIW;
}
arryNew[i] = '\0';
puts(arryNew); // prints Ifmmp
return 0;
}
答案 2 :(得分:0)
使事情变得更简单:目标字符串不会改变。
char arry[] = "073102109109112"; <--example string read from a file
char target[4] = {0};
for(int i = 0; i < strlen(arry) - 3; i+=3)
{
strncpy(target, arry + i, 3);
puts(target);
}
解码:
start at the beginning of arry
copy 3 characters to target
(note the fourth element of target is \0)
print out the contents of target
increment i by 3
repeat until you fall off the end of the string.
答案 3 :(得分:0)
您可以使用此代码完成您的任务,即以ascii值的形式转换给定的char数组。
char arry[] = "073102109109112";
char arryNew[16] = {0};
int i,j=0;
for(i = 0; i <= sizeof(arryNew)-2; i+=3)
{
arryNew[j]=arry[i]*100+arry[i+1]*10+arry[i+2]*1;
j++;
arryNew[j+1]='\0';
puts(arryNew);
}