拆分数组中的字符串值

时间:2015-12-08 16:31:35

标签: c arrays string

我必须将字符串输入值拆分,只要有空格并输出结果。

例如:输入:

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);
  }

}

感谢所有帮助我解决这个问题的人!

2 个答案:

答案 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保留位置。