我是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)]打印到数组的末尾,但没有尝试过我的工作。
答案 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语言处理基址,因此您也需要删除星号。
希望您的问题得到解答。