C - 将整数放在char数组中并提取它

时间:2016-06-07 21:34:38

标签: c arrays string char scanf

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 请在提供答案之后,你能解释一下为什么会这样吗?

4 个答案:

答案 0 :(得分:2)

您的计划结果称为 UNDEFINED BEAVAVIOR 。如果你正在学习,你必须使用编译器警告。

您的代码有很多问题,您应该阅读中的字符串,而不是尝试查看它们是否正常工作。

  1. 您使用sprintf()错误,您应该将指向char的指针作为第一个参数传递,指向有效数据。您正在传递未初始化的指针,这会导致未定义的行为

  2. 函数method1()请注意,方法适用于类或对象,在中没有方法,只有函数)也没有传递任何东西任何地方。指针values的数组是函数的本地数组,无法从函数外部访问。要将传递某些内容添加到某个函数中,您应该通过参数来执行此操作,这是另一种方法,因为您无法从程序调用{​​{1}},因为它是未定义的行为。

  3. 您正在使用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()

    其余的都一样。

  4. 我想说,你想要这个

    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调用将jvalues的字符串表示形式存储到sprintf中。你可能已经发现,这是不可能的。

    sprintf(&values[0],"%d" ,i);

在这里,您正在调用sprintfi的字符串表示形式存储到values[0]指向的内存位置。但如上所述,values[0]并未指向任何有用的内容,因为您尚未对其进行初始化。这很糟糕。

    sprintf(&values[1],"%d" ,j);

与上述相同。

    method2(values, 2);

在这里,您正在调用method2,但您尚未声明method2的签名。事实证明,method2需要char *和一个int。您正在传递values2values是一个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);

相关问题