我有一个简单的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;
}
答案 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;
}