连接字符串有错误

时间:2015-10-05 17:05:42

标签: c string string-concatenation

我在C中有此代码,但我不知道为什么会收到Argument of type “char” is incompatible with parameter of type 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
        }
    }

4 个答案:

答案 0 :(得分:3)

您正在混合charchar *number_string[]的声明可能不会警告您,因为NULL可能只被定义为0,这是合法的char和指针。但变量temp肯定是个问题:你没有显示它的声明,但是它的第一个赋值使它成为char,而它在strcat中的第二次使用假设它是{{} 1}}。

如果你想一次向字符串添加一个字符,你必须手工完成,如下所示:

char *

答案 1 :(得分:2)

char *strcat(char *dest, const char *src);期望其最后一个参数具有类型const char *

tempchar类型的变量。

因此您收到错误Argument of type “char” is incompatible with parameter of type const char*

你可以试试这样的......

strncat(number_string, &temp, 1)

我通常偏爱像......

sprintf (buffer, "%s%c", number_string, temp)

答案 2 :(得分:1)

这不是您的类型问题的答案;建议以另一种方式解决问题。

您希望使用输入字符串中的所有数字填充字符串。这没有标准功能。

您可以使用strcat,但该函数对字符串进行操作,字符串必须为零终止。您可以创建一个包含两个字符的临时字符串 - 一个数字和一个空终止符 - 但这将无效。 strcat还要求您确保不会溢出附加的char缓冲区。

在像你这样的情况下,通常更容易在低级别解决问题,您可以自己创建char数组,一次创建一个字符。例如,您可以使用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;    
}

注意代码如何跟踪数字字符串中的字符以及如何注意不要溢出缓冲区。数字字符串可能会被截断,但它始终以空值终止。

我还使用input[i] != '\0'来检测字符串的结尾(根据定义,它是空终止符'\0'),而不是调用始终启动的strlen(input)从字符串的开头寻找终结符。

答案 3 :(得分:0)

您的代码中存在多个问题:

  • 调用strlen(input_string - 1)最有可能调用未定义的行为。你可能意味着strlen(input_string) - 1如果input_string是一个空字符串,它仍会导致循环运行得太远;
  • 每次迭代调用strlen都是低效的;
  • 如果isdigit(temp)temp并且默认情况下已char签名,则
  • 调用char不正确;
  • strcat不能按照您的方式使用;
  • 如果所有数字都不适合目标数组,则应检查潜在的缓冲区溢出。

这是一个更简单的函数,用于从input_string中提取所有数字:

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';