(初学者)不知道为什么代码没有给出正确的输出
(Beginner) Don't know why code doesn't give correct output
首先,我尝试创建一个程序,它接受两个字符数组并从第一个数组中删除第二个数组中出现的任何字符。我添加了评论,以便更容易理解正在发生的事情。
#include <stdio.h>
void rcfs(char s[], char t[]){
int i=0, j=0;
while (t[i] != '[=10=]')
++i; /*find size of t*/
for (int x=0;x<i;++x){ /*go through both vals of x and
check vals of s to see if they equal a val of x, if so set j of s to 0*/
while (s[j]!=0){
if (s[j]==t[x]){
s[j]=0;
}
j++;
}
if (x<i-1)
j=0;
}
char new[8]; /*new char arr to be assigned to s*/
int x=0; //seperate counter that increments only when chars are added to new
for (int q=0;q<j;q++){
if (s[q]!=0)
new[x++]=s[q];
}
new[7]=0;
s=new; //maybe these need be pointers
}
int main(){
char s[]="I eat food";
char t[]="oe";
printf("Pre: %s\n", s);
rcfs(s, t);
printf("Post: %s", s);
return 0;
}
这是输出:
代替
'Post: I' 应该是:
'Post: I at fd'
总而言之,我得到了错误的输出,我目前不知道如何修复它。
开始于:
在函数rcfs
外实例化char new[8]
,传给那个函数,在函数returns后打印:
char new[8];
rcfs(s, t, new);
printf("Post: %s", new);
函数当然应该声明为void rcfs(char s[], char t[], char new[])
。
我建议你把算法反过来,在外循环中循环 s
。我还建议您使用 strlen
来查找字符串的长度,并使用 strchr
来查找字符串中是否存在字符。
示例:
#include <string.h>
void rcfs(char *s, char t[]) {
char *sw = s; // current writing position
for(; *s != '[=10=]'; ++s) { // s is the current reading pos
if(strchr(t, *s) == NULL) { // *s is not in t
*sw = *s; // save this character at sw
++sw; // and step sw
}
}
*sw = '[=10=]'; // null terminate
}
你的做法是完全错误的。
例如这个 while 循环
while (s[j]!=0){
if (s[j]==t[x]){
s[j]=0;
}
j++;
}
如果您将某个前面的字符设置为 0,则可能无法找到等于字符 t[x] 的字符。
例如,如果 s = "12"
和 t = "12"
那么在 for 循环的第一次迭代之后
for (int x=0;x<i;++x){
数组 s 看起来像 s = ""
因此 for 循环的第二次迭代中的 while 循环将由于条件
而立即退出
while (s[j]!=0){
这个带有幻数8
的字符数组的声明
char new[8];
没有意义。用户可以传递给函数任意长度的字符串。
在这个赋值语句中
s=new
指针类型char *
的局部变量s
(由于编译器将数组类型的参数调整为指向数组元素类型的指针)
由本地数组 new 的第一个元素的地址分配。这不会更改 main.
中声明的源数组 s
在不使用标准 C 字符串函数的情况下,您的函数可以按照下面的演示程序中所示的方式声明和定义。
#include <stdio.h>
char *rcfs( char s1[], const char s2[] )
{
if (*s2)
{
char *src = s1, *dsn = s1;
do
{
size_t i = 0;
while (s2[i] != '[=15=]' && s2[i] != *src) ++i;
if (s2[i] == '[=15=]')
{
if (src != dsn) *dsn = *src;
++dsn;
}
} while (*src++);
}
return s1;
}
int main( void )
{
char s[] = "I eat food";
printf( "Pre: %s\n", s );
printf( "Post: %s\n", rcfs(s, "oe"));
}
程序输出为
Pre: I eat food
Post: I at fd
首先,我尝试创建一个程序,它接受两个字符数组并从第一个数组中删除第二个数组中出现的任何字符。我添加了评论,以便更容易理解正在发生的事情。
#include <stdio.h>
void rcfs(char s[], char t[]){
int i=0, j=0;
while (t[i] != '[=10=]')
++i; /*find size of t*/
for (int x=0;x<i;++x){ /*go through both vals of x and
check vals of s to see if they equal a val of x, if so set j of s to 0*/
while (s[j]!=0){
if (s[j]==t[x]){
s[j]=0;
}
j++;
}
if (x<i-1)
j=0;
}
char new[8]; /*new char arr to be assigned to s*/
int x=0; //seperate counter that increments only when chars are added to new
for (int q=0;q<j;q++){
if (s[q]!=0)
new[x++]=s[q];
}
new[7]=0;
s=new; //maybe these need be pointers
}
int main(){
char s[]="I eat food";
char t[]="oe";
printf("Pre: %s\n", s);
rcfs(s, t);
printf("Post: %s", s);
return 0;
}
这是输出:
开始于:
在函数rcfs
外实例化char new[8]
,传给那个函数,在函数returns后打印:
char new[8];
rcfs(s, t, new);
printf("Post: %s", new);
函数当然应该声明为void rcfs(char s[], char t[], char new[])
。
我建议你把算法反过来,在外循环中循环 s
。我还建议您使用 strlen
来查找字符串的长度,并使用 strchr
来查找字符串中是否存在字符。
示例:
#include <string.h>
void rcfs(char *s, char t[]) {
char *sw = s; // current writing position
for(; *s != '[=10=]'; ++s) { // s is the current reading pos
if(strchr(t, *s) == NULL) { // *s is not in t
*sw = *s; // save this character at sw
++sw; // and step sw
}
}
*sw = '[=10=]'; // null terminate
}
你的做法是完全错误的。
例如这个 while 循环
while (s[j]!=0){
if (s[j]==t[x]){
s[j]=0;
}
j++;
}
如果您将某个前面的字符设置为 0,则可能无法找到等于字符 t[x] 的字符。
例如,如果 s = "12"
和 t = "12"
那么在 for 循环的第一次迭代之后
for (int x=0;x<i;++x){
数组 s 看起来像 s = ""
因此 for 循环的第二次迭代中的 while 循环将由于条件
while (s[j]!=0){
这个带有幻数8
char new[8];
没有意义。用户可以传递给函数任意长度的字符串。
在这个赋值语句中
s=new
指针类型char *
的局部变量s
(由于编译器将数组类型的参数调整为指向数组元素类型的指针)
由本地数组 new 的第一个元素的地址分配。这不会更改 main.
在不使用标准 C 字符串函数的情况下,您的函数可以按照下面的演示程序中所示的方式声明和定义。
#include <stdio.h>
char *rcfs( char s1[], const char s2[] )
{
if (*s2)
{
char *src = s1, *dsn = s1;
do
{
size_t i = 0;
while (s2[i] != '[=15=]' && s2[i] != *src) ++i;
if (s2[i] == '[=15=]')
{
if (src != dsn) *dsn = *src;
++dsn;
}
} while (*src++);
}
return s1;
}
int main( void )
{
char s[] = "I eat food";
printf( "Pre: %s\n", s );
printf( "Post: %s\n", rcfs(s, "oe"));
}
程序输出为
Pre: I eat food
Post: I at fd