这是我在使用strcat()
和strncat()
函数连接两个字符串时遇到问题的代码的特定部分。
strcat()
函数声明为char *strcat(char *dest, const char *src)
而strncat()
声明为char *strncat(char *dest, const char *src, size_t n)
,但是当第二个参数是字符串中的单个字符时,它们都会产生问题,即它不以'\0'
结尾。我需要将一个字符连接到一个字符串。
那么这两个函数还有其他选择,还是有办法让这些函数适合我?
char *cipher_str = (char *)malloc(sizeof(char) * 26);
for (int j = 0; j < col; j++) {
for (int i = 0; i < col; i++) {
if (min == cipher[0][i] && (done[i] != 1)) {
done[i] = 1;
for (int k = 0; k < rows; k++)
strcat(cipher_str, cipher[i][k]);
}
}
...
答案 0 :(得分:5)
这里最简单的方法就是将字符“手动”附加到字符串中,例如:
int m=0;
....
cipher_str[m++]=cipher[i][k];
....
cipher_str[m]='\0';
答案 1 :(得分:2)
由于您使用strcat附加1个字符,因此可以使用此功能。
void strcat(char* dest, char src)
{
int size;
for(size=0;dest[size]!='\0';++size);
dest[size]=src;
dest[size+1]='\0';
}
你提到你有&#39; \ 0&#39;在你的cipher_str&#39;结束时,我用它来确定长度。
答案 2 :(得分:0)
C中的strcat和strncat函数的另一种替代方法是什么?
内联代码可以与size_t m
一起使用,就像@Paul Ogilvie回答一样。
作为独立功能:
char *strcat_c(char *s, char c) {
size_t len = strlen(s);
s[len++] = c;
s[len] = '\0';
return s;
}
char *strncat_c(char *s, char c, size_t n) {
char sc[2] = { c, '\0' };
return strncat(s, sc, n);
}
// or with C11 compound literals
char *strncat_c(char *s, char c, size_t n) {
return strncat(s, (char [2]) { c, '\0' }, n);
}
答案 3 :(得分:0)
将单个字符转换为长度为1的字符串,然后使用Thread1:0
Thread2:0
Thread3:0
Thread4:0
Thread1:1
Thread2:1
Thread3:1
Thread4:1
Thread1:2
Thread2:2
Thread3:2
Thread4:2
Thread1:3
Thread2:3
Thread3:3
Thread4:3
Thread1:4
Thread2:4
Thread3:4
Thread4:4
Thread1:5
Thread2:5
Thread3:5
Thread4:5
Thread1:6
Thread2:6
Thread3:6
Thread4:6
Thread1:7
Thread2:7
Thread3:7
Thread4:7
Thread1:8
Thread2:8
Thread3:8
Thread4:8
Thread1:9
Thread2:9
Thread3:9
Thread4:9
Thread1:10
Thread2:10
Thread3:10
Thread4:10
strcat()
#include <string.h>
void appendchar(char *x, char y) {
char z[2];
z[0] = y;
z[1] = 0;
strcat(x, z);
}
注意缓冲区溢出
答案 4 :(得分:0)
您的代码存在多个问题:
cipher_str
分配了malloc()
,因此未初始化。将其作为strcat()
的目标字符串传递具有未定义的行为,因为它不包含正确的字符串。
将char
作为第二个参数传递给strcat
是不正确的。如果您坚持使用函数附加单个char
,则可以写:
char *cipher_str = calloc(26);
for (int j = 0; j < col; j++) {
for (int i = 0; i < col; i++) {
if (min == cipher[0][i] && done[i] != 1) {
done[i] = 1;
for (int k = 0; k < rows; k++)
strncat(cipher_str, &cipher[i][k], 1);
}
}
...
但是为这个简单的任务调用一个函数是不合适的,你不会检查cipher_str
是否足够长。
这是一个更简单的解决方案,带有索引变量:
char *cipher_str = (char *)malloc(sizeof(char) * 26);
int ii = 0;
for (int j = 0; j < col; j++) {
for (int i = 0; i < col; i++) {
if (min == cipher[0][i] && (done[i] != 1)) {
done[i] = 1;
for (int k = 0; k < rows; k++) {
if (ii < 25) {
cipher_str[ii++] = cipher[i][k];
} else {
// cipher_str is too short for the job.
}
}
}
cipher_str[ii] = '\0';
...