首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C-尺寸为1的无效读取

C-尺寸为1的无效读取
EN

Stack Overflow用户
提问于 2018-08-22 08:41:45
回答 2查看 883关注 0票数 1

好的,已经过了15个多小时了,我还是搞不清楚到底发生了什么!下面是hackerrank中时间转换问题的代码,函数接受一个字符串(12小时AM/PM格式的时间)并将其转换为军事(24小时)时间(返回字符串)。

问题就在函数char* timeConversion(char* s)中。

在这一行代码b = strcmp(ampm,"PM");

它总是给我带来我无法理解的错误。

“错误:大小为1的无效读取”

有人能帮我吗?!

代码语言:javascript
复制
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* readline();

/*
 * Complete the timeConversion function below.
 */

/*
 * Please either make the string static or allocate on the heap. For example,
 * static char str[] = "hello world";
 * return str;
 *
 * OR
 *
 * char* str = "hello world";
 * return str;
 *
 */

/* Swaps strings by swapping pointers */
void swap(char **str1_ptr, char **str2_ptr)
{
  char *temp = *str1_ptr;
  *str1_ptr = *str2_ptr;
  *str2_ptr = temp;
}  

void reverse(char str[], int length)
{
    int start = 0;
    int end = length -1;
    while (start < end)
    {
        swap(*(str+start), *(str+end));
        start++;
        end--;
    }
}
// Implementation of itoa()
char* itoa(int num, char* str, int base)
{
    int i = 0;
    bool isNegative = false;

    /* Handle 0 explicitely, otherwise empty string is printed for 0 */
    if (num == 0)
    {
        str[i++] = '0';
        str[i] = '\0';
        return str;
    }

    // In standard itoa(), negative numbers are handled only with 
    // base 10. Otherwise numbers are considered unsigned.
    if (num < 0 && base == 10)
    {
        isNegative = true;
        num = -num;
    }

    // Process individual digits
    while (num != 0)
    {
        int rem = num % base;
        str[i++] = (rem > 9)? (rem-10) + 'a' : rem + '0';
        num = num/base;
    }

    // If number is negative, append '-'
    if (isNegative)
        str[i++] = '-';

    str[i] = '\0'; // Append string terminator

    // Reverse the string
    reverse(str, i);

    return str;
}

char* timeConversion(char* s) {
    /*
     * Write your code here.
     */
    char *result = (char*)calloc(8,sizeof(char)) ;
    char *ampm = (char*)calloc(2,sizeof(char)) ;    
    char *hh = (char*)calloc(2,sizeof(char)) ;

    int a = 0, b = 0 ,c = 0,i;

    long int dec = 0;
    int len = strlen(s);

    // substring     hh:mm:ssAM
    while ( c < 2)      // 2 : LENGTH
    {
        ampm[c] = s[9+c-1];    // 9 : position
        hh[c] = s[1+c-1];      // 1 : position
        c++ ; 
    } 

    // string to int 
    //len = strlen(ampm);
    for(i = 0; i < 2 ; i++)
    {
        dec = dec * 10 + (hh[i] - '0');
    }

    b = strcmp(ampm,"PM");
    a = strcmp(ampm,"AM"); 
    printf("%d\n",a);
    printf("%d\n",b);

    // processing
    if (!strcmp(ampm,"AM") && dec==12)  dec = 0;
    if (!strcmp(ampm,"PM") && dec!=12) dec += 12; 

    //if (strcmp(s[9],'A') && dec==12)  dec = 0;
    //if (strcmp(s[9],'P') && dec!=12)  dec += 12;

    // convert int back to string 
    char* hhh = itoa(dec, hh, 10);    
    //dec = atol(hh);
    // hh = itoa(dec,10);
    // snprintf(result,9,"%d", dec);


    //printf("%s\n",hh);
    c = 0;
    char* sub;
    while (c < 9)
    {
        sub[c] = s[3+c-1];
        c++ ;
    }

    strcat(result,hhh);
    strcat(result,sub);

    return result;

}

int main()
{
    char *s = "07:05:45PM"; 

    char* result = timeConversion(s);

    printf("%s\n", result);

    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-22 08:59:19

代码中有4个问题。

  1. 您没有为NULL char为apmp分配内存 char *ampm = (char*)calloc(3,sizeof(char)) ;
  2. 您正在接收swap函数的双指针并传递char值。 void swap(char **str1_ptr, char **str2_ptr) 应该是 void swap(char *str1_ptr, char *str2_ptr) 然后调用交换函数,如下所示 swap((str+start), (str+end));
  3. 您没有将内存分配给sub指针 char* sub = malloc (9 * sizeof(char));
  4. 您不能释放hhsubampm的内存。 free (hh); free(ampm); free(sub);
票数 2
EN

Stack Overflow用户

发布于 2018-08-22 08:48:06

就像上面提到的评论一样,您似乎错过了空终止,例如:

char *ampm = (char*)calloc(2,sizeof(char)) ;

两个字符('am'/'pm')加上空终止将是3字符,而不是2。您必须确保所有字符串的大小都为len +1,并且正确地以'\0‘结尾。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51962920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档