【问题标题】:getting the first value of a null initialized array of strings获取空初始化字符串数组的第一个值
【发布时间】:2016-01-27 08:49:12
【问题描述】:

我正在尝试获取以 null 开头的字符串数组的第一个值。我尝试了所有我能想到的方法,但都没有运气。我会收到警告、错误或分段错误。打印空值并在 if 语句中使用它的正确方法是什么?一旦我弄清楚了这一点,我想在最后打印不等于 null 的字符串时得到那个 for 循环。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(int argc, char** argv) 
{
    char *strings_line_tokens[503] = {0};
    int i = 0;

    strings_line_tokens[0] = malloc(strlen("cookies")+1);
    strcpy(strings_line_tokens[0], "cookies");

    strings_line_tokens[2] = malloc(strlen("FOOBAR")+1);
    strcpy(strings_line_tokens[2], "FOOBAR");

    printf("strings_line_tokens[]: %s\n",strings_line_tokens[0]);
    printf("-------------------\n");

    printf("strings_line_tokens[]: %c %d \n",(char)strings_line_tokens[1], (int)strings_line_tokens[1]);
    printf("aaaaaaaaaaaaaaaa\n");

    printf("strings_line_tokens[]: %c %d \n",strings_line_tokens[1], strings_line_tokens[1]);
    printf("bbbbbbbbbbbbbbbb\n");

    printf("strings_line_tokens[]: %c %d \n",(char)strings_line_tokens[1][0], (int)strings_line_tokens[1][0]);
    printf("ccccccccccccccccccc\n");

    printf("strings_line_tokens[]: %c %d \n",strings_line_tokens[1][0], strings_line_tokens[1][0]);
    printf("-------------------\n");

    if(strings_line_tokens[1] == 0)
        printf("You have a NULL \n");

    for(i = 0; i < 3; i++)
        if(strings_line_tokens[i] != 0)
            printf("strings_line_tokens[]: %s\n",strings_line_tokens[i]);
    return 0;
}

这是我收到的当前警告。

main.c:13: warning: cast from pointer to integer of different size
main.c:13: warning: cast from pointer to integer of different size
main.c:15: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
main.c:15: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘char *’

这是 M.M 要求的更新。 Klas Lindbäck 展示了如何实现我的最终目标,即 for 循环工作。

根据过去的经验,当使用初始化为 null 的 char 数组时,%c 会在 printf() 中产生垃圾,而 %d 会给出 null 的 ascii 值,在 printf() 中为 0。所以我认为其中之一会给出垃圾和 ascii 值 0。

printf("strings_line_tokens[]: %c %d \n",(char)strings_line_tokens[1], (int)strings_line_tokens[1]);
printf("aaaaaaaaaaaaaaaa\n");

printf("strings_line_tokens[]: %c %d \n",strings_line_tokens[1], strings_line_tokens[1]);
printf("bbbbbbbbbbbbbbbb\n");

printf("strings_line_tokens[]: %c %d \n",(char)strings_line_tokens[1][0], (int)strings_line_tokens[1][0]);
printf("ccccccccccccccccccc\n");

printf("strings_line_tokens[]: %c %d \n",strings_line_tokens[1][0], strings_line_tokens[1][0]);
printf("-------------------\n");

我希望其中之一的输出。

garbage 0

【问题讨论】:

  • 你想做什么?另外,你经常重复自己。考虑重构为更多功能。你为什么一次又一次地打印一个字符的行?
  • 您的代码中有 2 个错误。 int i = 0缺少; ,你用{结束你的循环块而不是}
  • strings_line_tokens[1] 是 char* 类型,因此在这里转换为 char 或 int 没有意义。唯一应该按预期工作的是使用 char 类型的 strings_line_tokens[1][0] 的最后一个和倒数第二个 printf。
  • @AustinWBryan 我试图让 for 循环在最后工作。我试图展示我尝试过的东西。这些方法都不起作用。
  • @rockstar797 抱歉,我没有注意到格式说明符。请忽略。

标签: c arrays


【解决方案1】:

for 循环已经在工作了。

我删除了试错代码,只保留了for 循环:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(int argc, char** argv)
{
    char *strings_line_tokens[503] = {0};
    int i = 0;

    strings_line_tokens[0] = malloc(strlen("cookies")+1);
    strcpy(strings_line_tokens[0], "cookies");

    strings_line_tokens[2] = malloc(strlen("FOOBAR")+1);
    strcpy(strings_line_tokens[2], "FOOBAR");

    for(i = 0; i < 3; i++)
        if(strings_line_tokens[i] != 0)
            printf("strings_line_tokens[%d]: %s\n", i,strings_line_tokens[i]);
    return 0;
}

输出:

strings_line_tokens[0]: cookies
strings_line_tokens[2]: FOOBAR

没有打印空值的正确方法。我只需添加一个打印我想要的内容的 else 子句,例如字符串 null:

for(i = 0; i < 3; i++)
    printf("strings_line_tokens[%d]: %s\n", i, strings_line_tokens[i] == 0 ? "null": strings_line_tokens[i]);

或者(如果你更喜欢普通的if而不是三元if):

for(i = 0; i < 3; i++)
    if (strings_line_tokens[i] == 0) {
        printf("strings_line_tokens[%d]: %s\n", i, "null");
    } else {
        printf("strings_line_tokens[%d]: %s\n", i, strings_line_tokens[i]);
    }

新输出:

strings_line_tokens[0]: cookies
strings_line_tokens[1]: null
strings_line_tokens[2]: FOOBAR

【讨论】:

  • 你能提醒我 if else 符号的简写是什么意思吗?好久没看到了。
  • @rockstar797 添加了常规的 if 等效项。
猜你喜欢
  • 2020-08-26
  • 2013-06-03
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多