C - 无法编辑或打印字符数组

Posted

技术标签:

【中文标题】C - 无法编辑或打印字符数组【英文标题】:C - unable to edit or print char array 【发布时间】:2014-01-09 23:05:31 【问题描述】:

这里的新手问题...当我在函数中时,我应该如何正确处理表示字符串的可变字符数组?我正在这样做

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;

【问题讨论】:

您需要向我们展示出现问题的small complete program。我只是将您的代码复制并粘贴到一个小程序中,atoi(temp) 正确返回了1。见ideone.com/HrByzB temp是局部变量还是函数参数? temp 是一个局部变量,只是在该函数内部声明。 Works fine for me? 在你的比较中:if ((currentChar&gt;=0 &amp;&amp; currentChar&lt;=9),你的意思是if ((currentChar&gt;='0' &amp;&amp; currentChar&lt;='9')吗?我猜tmp 是空的,因为条件永远不会为真。 If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed and zero is returned. 这可以解释为什么你的输出为零。 【参考方案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;

【讨论】:

你是对的。我没有时间多看它,但这解释了为什么它只获得第一个坐标。我仍然无法使用调试器打印它,但我对此并不担心......只是有点好奇。

以上是关于C - 无法编辑或打印字符数组的主要内容,如果未能解决你的问题,请参考以下文章

在c中反转字符串数组[重复]

在C中打印反转的字符串/数组

C如何打印字符串数组中字符串的大小

将字符放入数组并在 C 中打印

PHP使用Echo打印字符串

无法在 C 中打印返回数组指针的函数的输出