如何在C中使用带有for循环的strncpy?

时间:2013-11-22 18:09:37

标签: c for-loop strncpy

我正在编写一个程序,它将文件中的每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个字符?

4 个答案:

答案 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);
}