C - 无法编辑或打印char数组

时间:2014-01-09 23:05:31

标签: c arrays string

新手问题在这里...当我在函数中时,我应该如何正确处理表示字符串的可变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;
}

1 个答案:

答案 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;
}