指针和数组的奇怪表现

时间:2012-09-22 07:37:55

标签: c arrays pointers

我是C的新手。

我正在尝试使用char数组(字符串)并通过分隔符将其分解为2个字符串。这是我的代码:

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

int main() {
    char line_array[260];
    char *line = line_array;
    scanf("%s", line_array);
    char *line2 = strdup(line);
    char *command = strtok(line2, " "); // WORKS FINE = open
    printf("%s %c\n", command, *(line+4)); // PRINTS: open (prints only command, *(line+4) is empty)
    return 0;
}

在我得到字符串的第一部分(其中说“工作正常=打开”)之后我想要实现的是将所有字符从command_array [strlen(command)]打印到数组的末尾,但没有尝试过我的工作。

6 个答案:

答案 0 :(得分:1)

在阅读完新的更新问题和代码之后,我终于知道了你的问题。问题是你获取字符串的方法,scanf将字符串读入缓冲区,但它将空白或CR / LF视为一个新的开始新输入。根据你的需要,你输入“abcdefg 9”,scanf("%s",value)只会得到abcdefg值,并在stdin缓冲区中保留“9”。所以你需要使用{{1获取所有输入,然后gets(value)

答案 1 :(得分:0)

您可以使用:

printf("%s\n", filename+4);

将字符串文件名从第5个字符串打印到字符串结尾

%c只打印一个字符

*(filename + 4)从字符串文件名中获取第5个字符代码。

filename + 4给出字符串文件名

的第5个字符的地址

答案 2 :(得分:0)

在C的表达式中,所有chars首先隐式转换为ints。当char参数传递给可变函数(如printf())时,它们也会隐式转换为ints。但我没有看到问题。

然而,我所看到的是explodestr()缺少返回char的返回语句,这恰好是一个整数。

答案 3 :(得分:0)

如果您的目标是阅读一行并将其拆分为第一个空格字符,则可以尝试:

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

int main() {
  char* line = NULL;
  size_t linesiz = 0;
  if (getline(&line, &linesiz, stdin) > 0) {
    char* space = strchr (line, ' ');
    if (space) {
       *space = (char)0; // to end the chunk before 
       printf ("first chunk is %s\n", line);
       printf ("after space have %s\n", space+1);
    }
  }
  return 0;
}

不要忘记在编译器中启用所有警告并学习如何调试。在Linux上,这意味着使用gcc -Wall -g进行编译并使用gdb调试器。

顺便说一句,如果你知道所有行都以一个单词开头(没有空格),那么一些空格字符(如空格,制表符,返回,换行符......)然后是一些整数,你可以声明

int i=0;
char buf[30];
memset (buf, 0, sizeof(buf)); // zero the buf

然后使用

if (scanf("%30s %d", buf, &i)>=2) { /* do something with buf & i */ }

许多人想要阅读feature_test_macros(7)

的手册页

答案 4 :(得分:0)

只需在循环中调用strtok即可。如果要解析相同的字符串,请将第一个参数设置为NULL。这将修改字符串,但我们在此示例中制作了一个副本以便使用。

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

int main(void)
{
    char line_array[260];
    char *line, *p;

    fgets(line_array, sizeof(line_array), stdin);
    line = strdup(line_array);

    p = strtok(line, " ");
    while (p) {
        puts(p);
        p = strtok(NULL, " ");
    }

    free(line);
    return 0;
}

答案 5 :(得分:0)

你的最后一行.....应该是

printf( "%s\n", ( line + 4 ) );

你完成了你的期望。

理由:

1。%c不能同时打印一个字符。

2。字符串始终以C语言处理基址,因此您也需要删除星号。 希望您的问题得到解答。