【发布时间】: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 抱歉,我没有注意到格式说明符。请忽略。