我编写了一个c程序,该程序从字符串中除去一个字符,而不是从多行中除去一个字符,然后编写代码以存储一个字符串的多行,但是在编译代码时,我无法获得正确的输出。拜托,请看一下。
#include <stdio.h>
int main()
{
char inputString[1000], ch, outputString[1000];
int i,j=0;
printf ("Enter a multi line string:\n");
scanf ("%[^;]s", inputString);
gets(inputString);
printf ("Enter a letter to be removed:\n");
scanf ("%c", &ch);
for (i=0; inputString[i]!='\0';i++)
{
if(inputString[i]==ch)
{
outputString[j]=inputString[i+1];
i++;
}
else
{
outputString[j]=inputString[i];
}
j++;
}
for (i=0;i<j;i++)
{
printf ("%c", outputString[i]);
}
return 0;
}
答案 0 :(得分:0)
程序中有几个问题
1)使用
scanf ("%[^;]s", inputString);
gets(inputString);
您用 scanf 之后的gets重写 inputString ,例如,如果输入为foo bar loop;
,则将{em> inputString 设置为{ {1}},然后您用foo bar loop
重新设置,因此您丢失了 scanf
2) scanf 和 gets 都可以从 inputString 中写出,您没有任何保护,可以读取的最大大小为赋予 scanf ,您可以将 gets 的使用替换为 fgets (忘记您在 inputString 中重写的事实)
3)您永远不会考虑EOF情况,总是假设输入了东西
4)在
;
if(inputString[i]==ch)
{
outputString[j]=inputString[i+1];
i++;
}
else
{
outputString[j]=inputString[i];
}
j++;
假定您从未连续两次删除该字符,这种方式是错误的。
5)要使用固定大小的数组不是强制性的,请先分配数组,然后在需要时 realloc
6)在
outputString[j]=inputString[i+1];
最好以空字符结尾 outputString ,以便通过 fputs 或 puts 打印以添加最后一个\ n,以防丢失
这里有个建议:
for (i=0;i<j;i++)
{
printf ("%c", outputString[i]);
}
编译和执行:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char * inputString = NULL;
size_t sz = 0, used = 0;
int v;
printf ("Enter a multi line string (ended by ';'):\n");
while ((v = getchar()) != ';') {
if (v == EOF) {
puts("premature EOF, abort");
return -1;
}
if (used == sz) {
sz += 100;
inputString = realloc(inputString, sz);
if (inputString == NULL) {
puts("not enough memory");
return -1;
}
}
inputString[used++] = v;
}
/* read up to end of line */
char * outputString = 0;
if (getline(&outputString, &sz, stdin) == -1) {
puts("premature EOF or not enough memory");
return -1;
}
free(outputString);
printf ("Enter a letter to be removed:\n");
char ch;
if (scanf ("%c", &ch) != 1) {
puts("premature EOF, abort");
return -1;
}
size_t i, j = 0;
outputString = malloc(used + 1); /* worst case, +1 to have place for null character */
for (i = 0; i != used; ++i)
{
if (inputString[i] != ch)
outputString[j++] = inputString[i];
}
outputString[j] = 0;
puts(outputString);
free(inputString);
free(outputString);
return 0;
}
在 valgrind 下执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -g l.c
pi@raspberrypi:/tmp $ ./a.out
Enter a multi line string (ended by ';'):
this is a paragraph
terminated by
a ;!!
Enter a letter to be removed:
i
ths s a paragraph
termnated by
a