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
。最后