新手问题在这里...当我在函数中时,我应该如何正确处理表示字符串的可变char数组?我正在做这个
char temp[BASE10LENGTH_DEGREE_DECIMALS+1]; //aka length of 7
memset(temp, 0, sizeof(temp));
正如你所看到的那样,那里有空终结符。但是,如果我做这样的事情
temp[i] = '1'; //when i = 0
然后在temp上调用atoi(),我得到0.编辑2:不,我没有!但我仍然无法在调试器中打印它。
另外,如果我查看调试器,temp不会扩展为数组,并且使用lldb的打印功能就可以了解这个
(lldb) print temp
error: incomplete type 'char []' where a complete type is required
error: 1 errors parsing expression
如果我使用char *和malloc它,它会起作用,但这不是我想要做的。我只想要一个char数组。我做错了什么?
编辑:这是整个方法。输入为“3,4,5”,len为7: 编辑2:实际上,atoi的问题是因为我通过输入少于9和大于0而不是小于'9'并且大于'0'来搞砸那些if语句...粗心错误。struct Coordinates{
unsigned int longitude;
unsigned int latitude;
unsigned short altitude;
};
struct Coordinates* getCoordinatesFromString(char* input, int len){
struct Coordinates* ret = malloc(sizeof(struct Coordinates));
char temp[BASE10LENGTH_DEGREE_DECIMALS+1];
memset(temp, '\0', sizeof(temp));
int i = 0; int i2 = 0; char currentChar;
while (input[i]!=','){
if (i>=len)
return NULL; //out of bounds error
currentChar = input[i];
if ((currentChar>=0 && currentChar<=9) || currentChar=='.') temp[i2] = currentChar;
i++;
i2++;
}
ret->latitude = atoi(temp);
memset(temp, 0, sizeof(temp));
i++; i2 = 0;
while (input[i]!=','){
if (i>=len)
return NULL; //out of bounds error
currentChar = input[i];
if ((currentChar>=0 && currentChar<=9) || currentChar=='.') temp[i2] = currentChar;
i++;
i2++;
}
ret->longitude = atoi(temp); //keeps giving me zero
memset(temp, 0, sizeof(temp));
i++; i2 = 0;
while (input[i]!=','){
if (i>=len)
break;
currentChar = input[i];
if ((currentChar>=0 && currentChar<=9) || currentChar=='.') temp[i2] = currentChar;
i++;
i2++;
}
ret->altitude = atoi(temp);
memset(temp, 0, sizeof(temp));
return ret;
}
答案 0 :(得分:1)
当你找到一个逗号时,你正在跳过逗号(++i
),但输入中的下一个输入字符是一个空格,因此temp[0]
最终会出现一个空字符,意味着atoi()
将返回0.您需要跳过逗号和空格。
或者,如果输入字符串以空值终止,则可以使用属于C运行时库的strtok()
函数来简化代码。例如:
#include <string.h>
struct Coordinates* getCoordinatesFromString(char* input)
{
struct Coordinates* ret = malloc(sizeof(struct Coordinates));
int part = 0;
if (ret != NULL) {
char *s = strtok(input, ",");
while (s != NULL && part < 3) {
int value = atoi(s);
switch(++part) {
case 1:
ret->latitude = value;
break;
case 2:
ret->longitude = value;
break;
case 3:
ret->altitude = value;
break;
}
s = strtok(NULL, ",");
}
/* if input was not valid, return NULL */
if (part < 3) {
free(ret);
ret = NULL;
}
}
return ret;
}