C 连接字符串时出错
我在C 连接字符串时出错,c,string,string-concatenation,C,String,String Concatenation,我在C中有这段代码,但我不知道为什么会出现类似类型为“char”的参数与类型为const char*的参数不兼容的错误 char number_string[size] = { NULL }; int counter = 0; for (counter = 0; counter < strlen(input_string - 1); counter++) {
C
中有这段代码,但我不知道为什么会出现类似类型为“char”的参数与类型为const char*的参数不兼容的错误
char number_string[size] = { NULL };
int counter = 0;
for (counter = 0; counter < strlen(input_string - 1); counter++)
{
temp = input_string[counter];
if (isdigit(temp))
{
strcat(number_string, temp); //temp variable has the error only in this line
}
}
charnumber_字符串[size]={NULL};
int计数器=0;
用于(计数器=0;计数器
您正在混合char
和char*
。number\u string[]
的声明可能不会警告您,因为NULL
可能只是定义为0
,作为字符和指针是合法的。但是变量temp
肯定是个问题:您没有显示它的声明,但它的第一个赋值使它成为char
,而它在strcat
中的第二个用法假定它是char*
如果要一次向字符串中添加一个字符,则必须手动执行,如下所示:
int nslen = strlen(number_string);
for ...
number_string[nslen++] = temp
number_string[nslen] = '\0';
char*strcat(char*dest,const char*src)
希望其最后一个参数的类型为const char*
temp
是char
类型的变量
因此,您得到的错误是,“char”类型的参数与const char*
类型的参数不兼容
你可以试试这样的
strncat(数字字符串和温度,1)
我通常喜欢像
sprintf(缓冲区,“%s%c”,数字字符串,临时)
这并不能解决您的类型问题;这是一个用另一种方法解决问题的建议
您希望用输入字符串中的所有数字填充字符串。没有标准函数可以执行此操作
您可以使用strcat
,但该函数对字符串进行操作,字符串必须以零结尾。您可以创建一个由两个字符组成的临时字符串——一个数字和一个空终止符——但这将是无效的strcat
还要求您确保附加到的字符缓冲区不会溢出
在像您这样的情况下,通常更容易在较低级别上解决问题,即您自己创建字符数组,一次创建一个字符。例如,您可以使用i
遍历输入字符串,并通过第二个索引j
将所有数字复制到数字字符串中:
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
int main()
{
size_t size = 12;
char number[size];
const char *input = "Alpha 123/Bravo 456/Charlie 789/Delta 007";
int i, j;
j = 0;
for (i = 0; input[i] != '\0'; i++) {
if (isdigit((unsigned char) input[i]) && j + 1 < size) {
number[j++] = input[i];
}
}
number[j] = '\0';
puts(number);
return 0;
}
#包括
#包括
#包括
int main()
{
尺寸=12;
字符数[大小];
const char*input=“Alpha 123/Bravo 456/Charlie 789/Delta 007”;
int i,j;
j=0;
对于(i=0;输入[i]!='\0';i++){
if(isdigit((无符号字符)输入[i])&&j+1
请注意,代码如何跟踪数字字符串中的字符,以及如何注意避免缓冲区溢出。数字字符串可能会被截断,但它将始终以null结尾
我还使用了
input[I]!='\0'
来检测字符串的结尾(根据定义,它是空终止符'\0'
),而不是调用strlen(input)
,strlen(input),strlen(input)总是从字符串的开头开始查找终止符。代码中存在多个问题:
- 调用strlen(输入字符串-1)很可能调用未定义的行为。您可能指的是
,如果strlen(input_string)-1
是空字符串,它仍然会导致循环运行过远李>input_string
- 每次迭代调用strlen都是低效的李>
- 如果
是temp
并且默认情况下对char
进行签名,则调用char
是不正确的李>isdigit(temp)
不能按您所称的方式使用李>strcat
- 如果目标数组中的所有数字都不适合,则应检查是否存在潜在的缓冲区溢出
char number_string[size];
int i, j;
for (i = j = 0; input_string[i] != '\0'; i++) {
unsigned char uc = input_string[i];
if (j < size - 1 && isdigit(uc)) {
number_string[j++] = uc;
}
}
number_string[j] = '\0';
char number_字符串[size];
int i,j;
对于(i=j=0;输入_字符串[i]!='\0';i++){
无符号字符uc=输入_字符串[i];
如果(j
字符数\u字符串[size]={NULL}代码>不是有效的声明。它应该是char*number\u string=NULL代码>或字符编号\u字符串[大小]=“mytext”代码>。这是干什么用的?如果你想要一个空字符串,你可以有,比如说,charnumber_string[size]=“”
strcat()的第二个参数必须是一个字符串,而不是一个字符您没有显示temp
,但不能使用它temp=input_string[counter]代码>以及strcat(数字字符串,温度)代码>。在第一种情况下,它必须是int temp
或char temp
,在第二种情况下(cat)它必须是char*temp
(指针或数组)。我希望您也启用了警告,因为temp=input_string[counter]代码>无效。strlen(输入字符串-1)
错误。您需要发布一个实际编译时没有任何错误或警告的文件(使用gcc使用-Wall
,或使用visualstudio使用-W4
)。将temp
存储到number\u string[]
?strcpy(number\u string,input\u string)的任何解决方案
他一次只想在number\u string
中添加一个字符……你只需手工操作即可。我会在开头创建一个变量nl=0
,然后在要添加temp
的地方,执行number\u string[nl++]=temp
。最后