C中的字符串操作是我存在的祸根,我试图理解如何操作char数组并且每次都没有抓住它。我只想在C中这样做。
Method1 passes ["1298","9"]
Method2 receives and converts them both to ints
int method1(){
char *values[2];
int i = 1298;
int j = 9;
//sprintf(values,"%d" "%d",i,j);
sprintf(&values[0],"%d" ,i);
sprintf(&values[1],"%d" ,j);
method2(values,2);
}
int method2(char *strings, int num_values){
int i, j;
char buffer[256];
sscanf(buffer, "%d" "%d", &i, &j);
printf("i: %d, j: %d\n",i,j);
return 0;
}
结果是1和9;但我想要1298和9 请在提供答案之后,你能解释一下为什么会这样吗?
答案 0 :(得分:2)
您的计划结果称为 UNDEFINED BEAVAVIOR 。如果你正在学习,你必须使用编译器警告。
您的代码有很多问题,您应该阅读c中的字符串,而不是尝试查看它们是否正常工作。
您使用sprintf()
错误,您应该将指向char
的指针作为第一个参数传递,指向有效数据。您正在传递未初始化的指针,这会导致未定义的行为。
函数method1()
(请注意,方法适用于类或对象,在c中没有方法,只有函数)也没有传递任何东西任何地方。指针values
的数组是函数的本地数组,无法从函数外部访问。要将传递某些内容添加到某个函数中,您应该通过参数来执行此操作,这是另一种方法,因为您无法从c程序调用{{1}},因为它是未定义的行为。
您正在使用main()
,而您显然是sscanf()
或fscanf()
。
如果您想阅读用户的输入,请使用
scanf()
您可以将if (scanf("%d %d", &i, &j) == 2)
printf("i: %d, j: %d\n", i, j);
else
printf("Invalid input\n");
替换为scanf()
或其他fscanf(stdin, ...
对象,以便从文件中读取。
在您的代码中,您的程序期望FILE *
包含一个字符串(以buffer
终止的字节序列)。您正在传递未初始化的数组,而不是调用未定义的行为。
如果您想测试'\0'
的工作原理,请执行此操作
sscanf()
其余的都一样。
我想说,你想要这个
char buffer[] = "1 2";
if (sscanf(buffer, "%d %d", &i, &j) ...
我希望你能看到,为什么你的代码错了。您也可以将所需的部件移动到该功能。但它应该是正确的部分。
答案 1 :(得分:2)
char *values[2];
上述行被解析为char *(values[2]);
,即[]
优先于*
。这意味着values
是一个包含2个元素的数组。元素的类型是char *
。因此,values[0]
和values[1]
属于char *
类型。由于尚未初始化数组元素,因此数组中的两个项具有未知的随机值。
//sprintf(values,"%d" "%d",i,j);
虽然您已对此进行了评论,但似乎您尝试使用i
调用将j
和values
的字符串表示形式存储到sprintf
中。你可能已经发现,这是不可能的。
sprintf(&values[0],"%d" ,i);
在这里,您正在调用sprintf
将i
的字符串表示形式存储到values[0]
指向的内存位置。但如上所述,values[0]
并未指向任何有用的内容,因为您尚未对其进行初始化。这很糟糕。
sprintf(&values[1],"%d" ,j);
与上述相同。
method2(values, 2);
在这里,您正在调用method2
,但您尚未声明method2
的签名。事实证明,method2
需要char *
和一个int。您正在传递values
和2
。 values
是一个char *
数组,在此上下文中转换为指针,因此method2
应该采用char **
和int
。
int method2(char *strings, int num_values){
这应该是:int method2(char **strings, int num_values) {
int i, j;
char buffer[256];
sscanf(buffer, "%d" "%d", &i, &j);
我不确定你在这里要做什么。您忽略strings
,而是使用buffer
变量。 buffer
未初始化,因此尝试将其中的数据解释为两个整数是没有意义的。
我假设你正在编写这个程序来理解字符串,指针和函数。因此,没有一种正确的方法来做你想做的事情。但这是一种方法:
#include <stdio.h>
/* Define method2 before method1, so that its definition is visible
in method1 */
/* Assume that method2 will be called with one char * containing two integer
values. I also changed the return type to void since you weren't really
using the int return value. Same for method1. */
void method2(const char *strings)
{
int i, j;
sscanf(strings, "%d %d", &i, &j);
printf("i: %d, j: %d\n",i,j);
}
void method1(void)
{
/* Changed values to a char array that has enough space */
char values[256];
int i = 1298;
int j = 9;
sprintf(values, "%d %d", i, j);
method2(values);
}
int main(void)
{
method1();
return 0;
}
以上输出:
i: 1298, j: 9
您的计划中有很多活动部分。我建议你在C语言中学习有关指针,数组等的基础知识,然后再将它们传递给函数。
答案 2 :(得分:1)
这是我写得很快的东西;你可以将一个字符串数组连同它的长度一起传递给这个函数,它将动态地分配一个整数数组及其转换值。
这里的缺陷是使用strtol
:如果它无法转换其中一个字符串,它将默认为0.因此,如果字符串数组中的元素碰巧包含一些非数字字符,则可能不会得到你所期望的;并且不会报告错误,因为您还必须确认字符串本身不是0。
#include <stdlib.h>
#include <stdio.h>
int *convert_to_int_array(const char **strings, size_t length) {
int *numbers = malloc(length * sizeof(int));
size_t i = 0;
if(numbers == NULL)
return NULL;
for(i = 0; i < length; i++) {
numbers[i] = strtol(strings[i], NULL, 10);
}
return numbers;
}
int main(int argc, char **argv) {
const char *strings[2];
strings[0] = "100";
strings[1] = "50";
int *numbers;
size_t length = 2, i;
numbers = convert_to_int_array(strings, length);
if(numbers == NULL) {
fprintf(stderr, "failed to initialize numbers\n");
}
for(i = 0; i < length; i++) {
printf("%d\n", numbers[i]);
}
return EXIT_SUCCESS;
}
答案 3 :(得分:-1)
试试这个:
char values[10];
int i = 1298;
int j = 9;
sprintf(values,"%d %d",i,j);