将单个字符从字符数组复制到C中的另一个字符数组

时间:2016-05-11 17:39:41

标签: c arrays loops strcpy

我对C编程很新,并试图改进。我已经看到了一些与此类似的问题并尝试使用strncpy来实现他们的建议,但它仍然无法正常工作。任何人都可以给我指向正确的方向吗?感谢。

代码的目标是给一个字符串并在找到空格时将其拆分。我故意不使用strtok()

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

char str[10] ;
char word[10] ;
int i, j, k, l ;

  int main()
{
  printf("Please enter a string of ten characters and I'll find the blanks\n") ;
  fgets(str,10,stdin) ;

  printf("Original string is %s\n", str) ;

  j = 0 ;

  for(i == 0 ; i < 10 ; i++){
    if(!isblank(str[i])){
      strncpy(word[j], &str[i], 1) ;
      printf("i = %d, j = %d, str[i] = %c, word[j] = %c\n",i, j, str[i], word[j]) ;
      j++ ;
    }else{
      printf("%s\n",word) ;
      j = 0 ;
    }
  }
  return 0 ;
}

3 个答案:

答案 0 :(得分:4)

我认为问题在于

for(i == 0 ; i < 10 ; i++)
      ^^

您应该使用作业(=),例如

for(i = 0 ; i < 10 ; i++)

设置i的初始值。否则,通过访问未初始化的局部变量(其值在不进行初始化的情况下是不确定的)的值,您的代码将调用undefined behavior

然后,strncpy()的使用也看起来不对,您没有按照第一个参数的要求传递char *

现在,那说了两件事,

  1. 要一次复制一个char,您只需使用分配,例如

    word[j] = str[i];
    
  2. 您应该只将输入数组循环到有效条目,而不是整个大小(10)。如果输入较小,您将再次点击UB。

答案 1 :(得分:3)

我认为你的问题不是指向strncpy函数中dest参数的指针。

strncpy(word[j], &str[i], 1) ;
        ^

添加指向strncpy函数

目标的指针
strncpy(&word[j], &str[i], 1) ;

以及解决Sourav Ghosh提到的问题,你应该拥有它。

答案 2 :(得分:0)

正如我在@James上评论的那样,这在没有strsep()的非BSD上是一个真正的问题。 根本上,strtok()和strtok_r()都是IMO的缺陷,因为它们单方面跳过了任何大于1个相邻定界符的序列。

我使用了以下解决方案: https://www.geeksforgeeks.org/c-program-replace-word-text-another-given-word/ 为了填补上面的空间空白,以便我可以对所有有效负载进行适当的标记化。 读者请注意,上述解决方案有一个缺陷...因此您可能需要多次调用它...不是最佳选择,但是如果您像我一样着急,我会使用它并且可以使用。

#include <cmath>

......上面是一个黑客,可以调用有缺陷的代码,最终有可能删除所有出现的定界符...这是肮脏的肮脏代码,所以请不要放鞭炮...在这里帮助因缺少strtok()和strtok_r()跳过方法而被阻止的人。