C-大小为1的无效读取
好了,就这样,已经15个多小时了,我还是不知道发生了什么事! 这是hackerrank中时间转换问题的代码,函数获取字符串(时间为12小时AM/PM格式)并将其转换为军事(24小时)时间(返回字符串) 问题恰恰出在函数C-大小为1的无效读取,c,strcmp,C,Strcmp,好了,就这样,已经15个多小时了,我还是不知道发生了什么事! 这是hackerrank中时间转换问题的代码,函数获取字符串(时间为12小时AM/PM格式)并将其转换为军事(24小时)时间(返回字符串) 问题恰恰出在函数char*timeConversion(char*s) 在这行代码中 b=strcmp(ampm,“PM”) 它总是给我错误,我不能理解 “错误:大小为1的读取无效” 谁能帮帮我 #include <assert.h> #include <limits.h>
char*timeConversion(char*s)
在这行代码中
b=strcmp(ampm,“PM”)代码>
它总是给我错误,我不能理解
“错误:大小为1的读取无效”
谁能帮帮我
#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
char*readline();
/*
*完成下面的时间转换功能。
*/
/*
*请将字符串设为静态或在堆上分配。例如
*静态字符str[]=“你好世界”;
*返回str;
*
*或
*
*char*str=“你好,世界”;
*返回str;
*
*/
/*通过交换指针来交换字符串*/
无效交换(字符**str1\u ptr,字符**str2\u ptr)
{
字符*temp=*str1\u ptr;
*str1_ptr=*str2_ptr;
*str2_ptr=温度;
}
无效反向(字符str[],整数长度)
{
int start=0;
int end=长度-1;
while(开始<结束)
{
互换(*(str+start),*(str+end));
启动++;
结束--;
}
}
//itoa()的实施
字符*itoa(整数,字符*str,整数基)
{
int i=0;
bool为阴性=假;
/*显式处理0,否则为0打印空字符串*/
如果(num==0)
{
str[i++]='0';
str[i]='\0';
返回str;
}
//在标准itoa()中,负数只能用
//以10为基数。否则,数字将被视为无符号。
如果(num<0&&base==10)
{
isNegative=true;
num=-num;
}
//处理单个数字
while(num!=0)
{
int rem=基数的num%;
str[i++]=(rem>9)?(rem-10)+'a':rem+'0';
num=num/基;
}
//如果数字为负数,则附加“-”
如果(为负)
str[i++]='-';
str[i]='\0';//追加字符串终止符
//把绳子倒过来
反向(str,i);
返回str;
}
字符*时间转换(字符*s){
/*
*在这里编写代码。
*/
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;
长整数dec=0;
int len=strlen(s);
//子字符串hh:mm:ssAM
而(c<2)//2:长度
{
ampm[c]=s[9+c-1];//9:位置
hh[c]=s[1+c-1];//1:位置
C++;
}
//字符串到整数
//len=strlen(ampm);
对于(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);
//加工
如果(!strcmp(ampm,“AM”)和&dec==12)dec=0;
如果(!strcmp(ampm,“PM”)和&dec!=12)dec+=12;
//如果(strcmp(s[9],'A')&&dec==12)dec=0;
//如果(strcmp(s[9],'P')&&dec!=12)dec+=12;
//将整型转换回字符串
char*hhh=itoa(12月,hh,10日);
//dec=环礁(hh);
//hh=itoa(12月10日);
//snprintf(结果,9,“%d”,12月);
//printf(“%s\n”,hh);
c=0;
char*sub;
而(c<9)
{
sub[c]=s[3+c-1];
C++;
}
strcat(结果,hhh);
strcat(结果,子项);
返回结果;
}
int main()
{
char*s=“07:05:45PM”;
字符*结果=时间转换;
printf(“%s\n”,结果);
返回0;
}
与前面提到的评论者一样,您似乎缺少空终止符,例如:
char*ampm=(char*)calloc(2,sizeof(char))代码>
两个字符('am'/'pm')加上空终止符将是3个字符,而不是2个字符。
您必须确保所有字符串的大小均为len+1,并以“\0”结尾。与前面提到的注释一样,您似乎缺少空结尾,例如:
char*ampm=(char*)calloc(2,sizeof(char))代码>
两个字符('am'/'pm')加上空终止符将是3个字符,而不是2个字符。
您必须确保所有字符串的大小均为len+1,并正确终止“\0”。代码中有4个问题
您没有将内存分配给apmp的NULL
char
char*ampm=(char*)calloc(3,sizeof(char))代码>
您正在接收swap
函数的双指针并传递char
值
无效交换(字符**str1\u ptr,字符**str2\u ptr)
应该是
无效交换(char*str1\u ptr,char*str2\u ptr)
您可以像下面这样调用swap函数
swap((str+start),(str+end))代码>
您没有将内存分配给sub
指针
char*sub=malloc(9*sizeof(char))代码>
您没有为hh
、sub
和ampm
释放内存
免费(hh);免费(ampm);免费(sub)代码>
代码中有4个问题
您没有将内存分配给apmp的NULL
char
char*ampm=(char*)calloc(3,sizeof(char))代码>
您正在接收swap
函数的双指针并传递char
值
无效交换(字符**str1\u ptr,字符**str2\u ptr)
应该是
无效交换(char*str1\u ptr,char*str2\u ptr)
您可以像下面这样调用swap函数
swap((str+start),(str+end))代码>
您没有将内存分配给sub
指针
char*sub=malloc(9*sizeof(char))代码>
您没有为hh
、sub
和ampm
释放内存
免费(hh);免费(ampm);F