当前位置: 首页 > 知识库问答 >
问题:

在计算C语言中的二和编码问题时,如何解决这个错误

左博学
2023-03-14

给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。

给定nums=[2,7,11,15],target=9,

因为nums[0]nums[1]=27=9,所以返回[0,1]。

#include<stdio.h>
int* twoSum(int* nums, int numsSize, int target);

int main(){

    int*array;
    int arraySize;
    scanf("%d",&arraySize);
    for (int i=0;i<arraySize;i++){
        scanf("%d",&array[i]);
    }

    int target;
    scanf("%d",&target);
    int* positions=twoSum(array, arraySize, target);
    printf("The positions are: %p",positions);
    return 0;
}


int* twoSum(int* nums, int numsSize, int target){
    int *returnSize = NULL;
    for(int i=0,sum=0;i<numsSize;i++){
        for(int j=0;j<numsSize;j++){
            sum =sum+nums[i]+nums[j];
            if(sum==target){
                returnSize[0]=nums[i];
                returnSize[1]=nums[j];
            }
            else 
                returnSize[0]= -1;
                returnSize[1]= -1;
        }
    }
    return returnSize;
}

我收到的错误引用了代码中的一行空代码。请帮忙

共有3个答案

吕志诚
2023-03-14

这是您的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h>

int* twoSum(int* nums, int numsSize, int target);
void print_pos(int * arr, int i) {
    printf("test %d\n", i);
    if (arr != NULL) {
        printf("position 1 = %d, position 2 = %d\n", arr[0], arr[1]);
    } else
        printf("Not found\n");
}

int main(){

    int array[5] = {5, 6, 2 ,1 ,3} ;

    int target1 = 11, target2 = 9, target3 = 15;
    int * positions1=twoSum(array, 5, target1);
    int * positions2=twoSum(array, 5, target2);
    int * positions3=twoSum(array, 5, target3);

    print_pos(positions1, 1);
    print_pos(positions2, 2);
    print_pos(positions3, 3);

    return 0;
}


int* twoSum(int* nums, int numsSize, int target){
    int *return_arr = malloc(sizeof(int) * 2);
    bool found = false;
    for(int i=0;i<numsSize;i++){
        for(int j=0;j<numsSize;j++){
            if((nums[i]+nums[j])==target){
                return_arr[0]= i;
                return_arr[1]= j;
                found = true;
            }
        }
    }
    if (found)
        return return_arr;
    else {
        free(return_arr);
        return NULL;
    }
}
艾骏喆
2023-03-14

您的代码中有一些错误:

您在int上声明指针以存储要处理和结果的数据,但不分配内存:malloc用于内存ALLOCation:

array = malloc(sizeof *array * arraySize);

int *returnSize = malloc(sizeof *returnSize * 2);

twoSum函数中,sum变量越来越大:sum=sum nums[i]nums[j]

相反,一个简单的if(target==nums[i]nums[j])将执行您想要的测试。

在代码中,每次sum不等于target,您都会将returnSize[0]重置为-1

您不需要有一个其他子句:您可以在for循环之前初始化返回大小

看看你的第一个代码:对于sum和target的任何值,returnSize[1]被设置为-1,因为你忘记了在else之后加上赞誉(但是,如前所述,你甚至不需要else

gcc可以警告你这样的问题(-Wmisic-indent,或者更好的-Wall

    for(int j=0;j<numsSize;j++){
        sum =sum+nums[i]+nums[j];
        if(sum==target){
            returnSize[0]=nums[i];
            returnSize[1]=nums[j];
        }
        else 
            returnSize[0]= -1;
        returnSize[1]= -1;
    }

考虑到这一点,你可以编写一个代码来做你想做的事情。

要小心,还应该测试scanfmalloc返回值。。。

#include <stdio.h>
#include <stdlib.h>
int *twoSum(int *nums, int numsSize, int target);

int main()
{
    int *array;
    int arraySize;

    // TODO: test that scanf returned 1
    scanf("%d", &arraySize);

    // TODO: test that arraysize is at least 2

    /* allocate array to store the numbers*/
    array = malloc(sizeof *array * arraySize);

    for (int i = 0; i < arraySize; i++) {
        // TODO: test that scanf returned 1
        scanf("%d", &array[i]);
    }

    int target;
    // TODO: test that scanf returned 1
    scanf("%d", &target);
    int *positions = twoSum(array, arraySize, target);
    printf("The positions are: %d(%d) %d(%d)\n", positions[0], array[positions[0]], positions[1], array[positions[1]]);


    /* memory has been allocated? free it */
    free(positions)
    free(array)

    return 0;
}

int *twoSum(int *nums, int numsSize, int target)
{
    int *returnSize = malloc(sizeof *returnSize * 2);

    returnSize[0] = returnSize[1] = -1;

    for (int i = 0; i < numsSize; i++) {
        for (int j = 0; j < numsSize; j++) {
            if (target ==nums[i] + nums[j] ) {
                returnSize[0] = i;
                returnSize[1] = j;
                return returnSize;
            }
        }
    }
    return returnSize;
}

潘国源
2023-03-14

这段代码有错误。首先,应该为int*数组分配内存 int-arraySize后的code> 作为输入,你可以这样做

数组=malloc(sizeof(int)*arraysize);

那么这里的%p不合适,请使用%d。查看此处以了解有关%p%p格式说明符的更多信息,而且由于要打印两个位置,您需要在printf中调用两个参数,如下printf(“位置是:%d%d”,位置[0],位置[1])

twoSum函数中,需要为int*returnSize分配内存 像这样returnSize=malloc(sizeof(int)*2)

在这里,你不是在返回找到的元素的位置,而是在返回元素本身。

            if(sum==target){
                returnSize[0]=nums[i];
                returnSize[1]=nums[j];
            }

此外,您还需要在此if语句中添加return,否则将完全遍历数组,returnSize元素将再次成为-1(除非答案是数组的最后一个元素

所以这个如果应该是这样的:

            if (sum == target) {
                returnSize[0] = i;//num[i] is not position. it is element of array
                returnSize[1] = j;//num[j] is not position .it is element of array
                return returnSize;//otherwise it will traverse array compeltely and they -1 again
            }

也只有当你为if,else,while,for (条件语句),可以避免使用大括号,否则,如果该条件变为真,则只会执行代码的一行,因此您必须为该else添加一个块:

            else
            {
                returnSize[0] = -1;
                returnSize[1] = -1;
            }//coding more than one line so your else should be in a block

这里也是sum=sum num[i]num[j]错误,您应该将其更改为sum=num[i]num[j] 因为你只想检查两个当前数字的和,或者更好的方法根本不用和,只检查目标与num[i]num[j]

以下是完整的代码:

int* twoSum(int* nums, int numsSize, int target);

int main() {

    int* array;
    int arraySize;
    scanf("%d", &arraySize);
    array = malloc(sizeof(int) * arraySize);//allocate memory for array
    for (int i = 0; i < arraySize; i++) {
        scanf("%d", &array[i]);
    }

    int target;
    scanf("%d", &target);
    int* positions = twoSum(array, arraySize, target);
    printf("The positions are: %d %d", positions[0], positions[1]);//%p is for not for content of array
    return 0;
}


int* twoSum(int* nums, int numsSize, int target) {
    int* returnSize ;
    returnSize = malloc(sizeof(int) * 2);
    for (int i = 0; i < numsSize; i++) {
        for (int j = 0; j < numsSize; j++) {             
            if (nums[i] + nums[j] == target) {
                returnSize[0] = i;//num[i] is not position. it is element of array
                returnSize[1] = j;//num[j] is not position .it is element of array
                return returnSize;//otherwise it will traverse array compeltely and they -1 again
            }
            else
            {
                returnSize[0] = -1;
                returnSize[1] = -1;
            }//coding more than one line so your else should be in a block
        }
    }
    return returnSize;
}

 类似资料:
  • 启动错误 ApplicationContext.若要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2019-10-17 15:44:43.968错误10460--[main]O.S.Boot.SpringApplication:应用程序运行失败 我的pom.xml:

  • 我正试图在Android Studio上调试我的项目——一个非常简单的东西——hello world。我得到这个信息: "安装未成功。应用程序无法安装:INSTALL_FAILED_MISSING_SHARED_LIBRARY apk列表:[0]'C:\Users\Pierr\AndroidStudioProjects\Hello\app\build\outputs\apk\debug\app d

  • 我正在尝试“CountDiinctSlices”代码性问题。我尽力了,得分30%,所以试图查找这样做的人以获得洞察力。基本上,我在答案中没有得到的是初始化的数组(和)的使用以及它是如何被使用的,得到它的人可以友好地引导我完成这段代码。 这是我没有解释就找到的答案 这是全部问题 给出了一个整数M和一个由N个非负整数组成的非空数组a。数组A中的所有整数都小于或等于M。 一对整数(P,Q),使得0≤ P

  • 正在启动Gradle守护进程...Gradle守护进程5 s 654 ms启动 失败:生成失败,出现异常。 > 其中:构建文件'c:\users\asus\androidstudioprojects\culturelwordsgame\app\Build.gradle'行:1 错误:评估项目':app'时出现问题。 未能应用插件[id'com.android.internal.version-ch

  • 在调试模式下启动SM A105F上的lib\main.dart...正在运行分级任务“组装调试”...√build build\app\outputs\flutter-apk\app-debug.apk。正在安装build\app\outputs\flutter-apk\app.apk...错误:ADB退出,退出代码为1执行流式安装

  • 本文向大家介绍解决Android 源码编译错误的问题,包括了解决Android 源码编译错误的问题的使用技巧和注意事项,需要的朋友参考一下 如下所示: Building with Jack: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex FAILED: /bin/bash ou