我必须将字符串输入值拆分,只要有空格并输出结果。
例如:输入:
I am a noob at C
输出:
>>I
>>am
>>a
>>noob
>>at
>>C
代码:
void splitText(){
char str[100];
char sep[] = " \r\n";
char *res; //if i remove this
fgets(str,sizeof str,stdin);
if (fgets(str, sizeof str, stdin) == NULL) {
printf("error");
}
char *p = strchr(str, '\n');
if (p) *p = 0;
res = strtok(str, sep); //and this
printf("%s\n",res); //and change this to str
}
遇到同样问题的人的工作代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void splitText() {
char str[100];
char sep[] = " \n";
char *res;
fgets(str,sizeof str, stdin);
if ( fgets(str, sizeof str, stdin) == NULL ) {
printf("Error");
break;
}
res = strtok(str, sep);
while(res != NULL){
printf("Splitted String: \"%s\"\n",res);
res = strtok(NULL,sep);
}
}
感谢所有帮助我解决这个问题的人!
答案 0 :(得分:3)
的问题
char str[100] = scanf("%s",str);
是您要将int
分配给char
数组。
scanf()
返回成功扫描的项目数。将字符实际读入数组是由scanf()
本身完成的。所以你只需要单独拨打scanf()
。
if (scanf("%s",str) != 1) { /* error */}
但是scanf()
不是正确的工具,因为你想读一整行。 scanf()
将在第一个空格处停止(在读取非空格字符后)。
因此,当您输入"I am a noob at C"
时,scanf()
只会阅读I
而忽略其余内容。
您想要的是使用fgets()
函数来读取一行:
char str[100];
if (fgets(str, sizeof str, stdin) == NULL) {
/* error */
}
/* rest of the code */
如果缓冲区中有空格, fgets()
也会读取换行符。如果这是不合需要的,那么你可以删除它:
char *p = strchr(str, '\n');
if (p) *p = 0; //remove the trailing newline.
注意: strtok()
不是线程安全函数。 POSIX提供strtok_r()
作为线程安全的替代方案。即使在这种特定情况下并不重要,也应注意这一点。
这是一个自包含的例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char str[100];
char sep[] = " \n";
char *res;
if ( fgets(str, sizeof str, stdin) == NULL ) {
exit(1);
}
res = strtok(str, sep);
while(res != NULL){
printf("Splitted String: \"%s\"\n",res);
res = strtok(NULL,sep);
}
return 0;
}
答案 1 :(得分:2)
这不是scanf()
的工作方式。
将代码更改为
char str[100];
scanf("%s",str);
关于scanf()
您应该检查返回值,例如scanf()
。
if (scanf("%s", str) != 1)
{
printf("scanf failed");
exit(0);
}
<小时/> 您还应该提及
char
要读取的scanf()
个数,以避免缓冲区溢出。
scanf("%99s", str)
对于char str[100]
大小为100
的人,应该99
为空字符\0
保留位置。