基本string.h问题(C ++)

时间:2011-05-07 15:01:50

标签: c++ string

我有一个简单的C ++文件,它会从文本文件中删除字符,但我想更改它。

文本字符串如下:

XXXXX | YYYYYYYYYYYYYYYYYYY

目前它将删除

| YYYYYYYYYYYYYYYYYYYY

来自字符串,虽然我希望它删除:

XXXXX |

相反,所以实际上取出了左侧而不是右侧。

我目前的代码是:

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

main(int argc, char *argv[])
{
    char s[2048], *pos=0;
    while (fgets(s, 2048, stdin))
    {
        if (pos = strpbrk(s, "|\r\n"))
            *pos='\0';
        puts(s);
    }
    return 0;
}

3 个答案:

答案 0 :(得分:2)

你很少在C ++程序中使用<string.h>

您应该使用<string>;你也许可以使用<cstring>

这甚至没有查看你的代码 - 如果你正在编写C ++,就忘记<string.h>存在;它是C功能的C头。类似的评论适用于<stdio.h>;它是一个C头,很少在C ++中使用(通常使用<iostream>,或偶尔使用<cstdio>)。

您的main()函数需要返回类型int(在C ++和C99中)。 由于您需要管道之后的信息,您可以编写(一个完全有效的C(C89,C99)程序 - 根本不使用C ++的任何显着特性,尽管C ++编译器也会接受它):

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

int main(int argc, char *argv[])
{
    char s[2048];
    while (fgets(s, sizeof(s), stdin))
    {
        char *pos = strpbrk(s, "|\r\n");
        if (pos != 0)
            fputs(pos+1, stdout);
    }
    return 0;
}

使用fputs()代替puts()以避免输出的双倍间距。

答案 1 :(得分:1)

使用另一个阵列,在阅读XXXXX时分配目标数组中的字符。当你遇到|在源代码字符串中,在目标字符串中指定一个“\ 0”。或者,如果您不想使用另一个辅助阵列,则需要将带有'Y'的部件的起点移动到阵列的前面。为此,你将一个计数器固定到数组的基数(i)(你想要移动下一个部分的位置),然后将字符串扫描到第一个'Y'的部分将其存储到另一个计数器(j) 。现在j

这是移位版本,只使用一个数组。

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

int main (void)
{
  char s[1024];
  int i, j, n;
  printf ("\ns: ");
  scanf (" %[^\n]", s);
  n = strlen (s);

  i = j = 0;
  /* Find the dilimeter index */
  while ((j < n) && s[j] != '|')
   j++;
  /* Move the other side of the dilimeter to
   * the begining pointed by index i. note that
   * we avoid the delimeter to be copied by 
   * pre-incrementing the counter j
   */
  while (j<n)
   s[i++] = s[++j];

  s[i] = '\0'; /* Terminate String */

  printf ("\n%s\n", s);
  return 0;
}

在这种情况下,2阵列版本基本相同。

答案 2 :(得分:0)

strpbrk()返回'|'的位置,因此只需使用它来输出左边裁剪的字符串。以下将输出|YYYYYYYYYYYYYYYY您需要稍微修改以删除主要 '|'

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

main(int argc, char *argv[])
{
    char s[2048], *pos=0;
    while (fgets(s, 2048, stdin))
    {
        if (pos = strpbrk(s, "|\r\n"))
            puts(pos);
    }
    return 0;
}