我对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 ;
}
答案 0 :(得分:4)
我认为问题在于
for(i == 0 ; i < 10 ; i++)
^^
您应该使用作业(=
),例如
for(i = 0 ; i < 10 ; i++)
设置i
的初始值。否则,通过访问未初始化的局部变量(其值在不进行初始化的情况下是不确定的)的值,您的代码将调用undefined behavior。
然后,strncpy()
的使用也看起来不对,您没有按照第一个参数的要求传递char *
。
现在,那说了两件事,
要一次复制一个char
,您只需使用分配,例如
word[j] = str[i];
您应该只将输入数组循环到有效条目,而不是整个大小(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()跳过方法而被阻止的人。