连接错误的字符串
Concatenate string with error
我在 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
}
}
您正在混合 char
和 char *
。 number_string[]
的声明可能不会警告您,因为 NULL
可以简单地定义为 0
,它作为 char 和指针是合法的。但是变量 temp
肯定是个问题:你没有显示它的声明,但它的第一次赋值使它成为 char
,而它在 strcat
中的第二次使用假定它是 char *
.
如果您想一次将一个字符添加到字符串中,则必须手动完成,如下所示:
int nslen = strlen(number_string);
for ...
number_string[nslen++] = temp
number_string[nslen] = '[=10=]';
char *strcat(char *dest, const char *src);
期望其最后一个参数的类型为 const char *
temp
是 char
.
类型的变量
所以你得到了错误 Argument of type “char” is incompatible with parameter of type const char*
。
你可以试试这样的……
strncat(number_string, &temp, 1)
我通常喜欢...
sprintf (buffer, "%s%c", number_string, temp)
这不是您的类型问题的答案;建议用另一种方式解决问题。
您想用输入字符串中的所有数字填充一个字符串。没有执行此操作的标准函数。
您可以使用 strcat
,但该函数对必须以零结尾的字符串进行操作。您可以创建一个由两个字符组成的临时字符串——一个数字和一个空终止符——但这将是无效的。 strcat
还要求您确保不会溢出附加到的字符缓冲区。
在像您这样的情况下,通常更容易在较低级别解决问题,您可以自己创建 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] != '[=10=]'; i++) {
if (isdigit((unsigned char) input[i]) && j + 1 < size) {
number[j++] = input[i];
}
}
number[j] = '[=10=]';
puts(number);
return 0;
}
请注意代码如何跟踪数字字符串中的字符以及如何注意不要溢出缓冲区。数字字符串可能会被截断,但它将始终以 null 结尾。
我还使用 input[i] != '[=15=]'
来检测字符串的结尾(根据定义,它是空终止符 '[=16=]'
)而不是调用 strlen(input)
,它总是开始从字符串的开头寻找终止符。
您的代码中存在多个问题:
- 调用
strlen(input_string - 1)
最有可能调用未定义的行为。您的意思可能是 strlen(input_string) - 1
如果 input_string
是一个空字符串,它仍然会导致循环 运行 太远;
- 每次迭代调用
strlen
无论如何都是低效的;
- 如果
temp
是 char
且 char
默认已签名,则调用 isdigit(temp)
是不正确的;
strcat
不能像你说的那样使用;
- 如果所有数字都不适合目标数组,您应该检查潜在的缓冲区溢出。
这是一个更简单的函数,可以从 input_string:
中提取所有数字
char number_string[size];
int i, j;
for (i = j = 0; input_string[i] != '[=10=]'; i++) {
unsigned char uc = input_string[i];
if (j < size - 1 && isdigit(uc)) {
number_string[j++] = uc;
}
}
number_string[j] = '[=10=]';
我在 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
}
}
您正在混合 char
和 char *
。 number_string[]
的声明可能不会警告您,因为 NULL
可以简单地定义为 0
,它作为 char 和指针是合法的。但是变量 temp
肯定是个问题:你没有显示它的声明,但它的第一次赋值使它成为 char
,而它在 strcat
中的第二次使用假定它是 char *
.
如果您想一次将一个字符添加到字符串中,则必须手动完成,如下所示:
int nslen = strlen(number_string);
for ...
number_string[nslen++] = temp
number_string[nslen] = '[=10=]';
char *strcat(char *dest, const char *src);
期望其最后一个参数的类型为 const char *
temp
是 char
.
所以你得到了错误 Argument of type “char” is incompatible with parameter of type const char*
。
你可以试试这样的……
strncat(number_string, &temp, 1)
我通常喜欢...
sprintf (buffer, "%s%c", number_string, temp)
这不是您的类型问题的答案;建议用另一种方式解决问题。
您想用输入字符串中的所有数字填充一个字符串。没有执行此操作的标准函数。
您可以使用 strcat
,但该函数对必须以零结尾的字符串进行操作。您可以创建一个由两个字符组成的临时字符串——一个数字和一个空终止符——但这将是无效的。 strcat
还要求您确保不会溢出附加到的字符缓冲区。
在像您这样的情况下,通常更容易在较低级别解决问题,您可以自己创建 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] != '[=10=]'; i++) {
if (isdigit((unsigned char) input[i]) && j + 1 < size) {
number[j++] = input[i];
}
}
number[j] = '[=10=]';
puts(number);
return 0;
}
请注意代码如何跟踪数字字符串中的字符以及如何注意不要溢出缓冲区。数字字符串可能会被截断,但它将始终以 null 结尾。
我还使用 input[i] != '[=15=]'
来检测字符串的结尾(根据定义,它是空终止符 '[=16=]'
)而不是调用 strlen(input)
,它总是开始从字符串的开头寻找终止符。
您的代码中存在多个问题:
- 调用
strlen(input_string - 1)
最有可能调用未定义的行为。您的意思可能是strlen(input_string) - 1
如果input_string
是一个空字符串,它仍然会导致循环 运行 太远; - 每次迭代调用
strlen
无论如何都是低效的; - 如果
temp
是char
且char
默认已签名,则调用isdigit(temp)
是不正确的; strcat
不能像你说的那样使用;- 如果所有数字都不适合目标数组,您应该检查潜在的缓冲区溢出。
这是一个更简单的函数,可以从 input_string:
中提取所有数字char number_string[size];
int i, j;
for (i = j = 0; input_string[i] != '[=10=]'; i++) {
unsigned char uc = input_string[i];
if (j < size - 1 && isdigit(uc)) {
number_string[j++] = uc;
}
}
number_string[j] = '[=10=]';