两个 C 函数试图 return 字符串中的第一个单词
two C functions trying to return the first word in a string
我创建了以下两个函数。第一个,eatWrd,returns 字符串中没有任何空格的第一个单词,并从输入字符串中删除第一个单词:
MAX 是表示字符串最大长度的数字
char* eatWrd(char * cmd)
{
int i = 0; //i will hold my place in cmd
int count = 0; //count will hold the position of the second word
int fw = 0; //fw will hold the position of the first word
char rest[MAX]; // rest will hold cmd without the first word
char word[MAX]; // word will hold the first word
// start by removing initial white spaces
while(cmd[i] == ' ' || cmd[i] == '\t'){
i++;
count++;
fw++;
}
// now start reading the first word until white spaces or terminating characters
while(cmd[i] != ' ' && cmd[i] != '\t' && cmd[i] != '\n' && cmd[i] != '[=11=]'){
word[i-fw] = cmd[i];
i++;
count++;
}
word[i-fw] = '[=11=]';
// now continue past white spaces after the first word
while(cmd[i] == ' ' || cmd[i] == '\t'){
i++;
count++;
}
// finally save the rest of cmd
while(cmd[i] != '\n' && cmd[i] != '[=11=]'){
rest[i-count] = cmd[i];
i++;
}
rest[i-count] = '[=11=]';
// reset cmd, and copy rest back into it
memset(cmd, 0, MAX);
strcpy(cmd, rest);
// return word as a char *
char *ret = word;
return ret;
}
第二个,frstWrd,只是returns第一个词,不修改输入字符串:
// this function is very similar to the first without modifying cmd
char* frstWrd(char * cmd)
{
int i = 0;
int fw = 0;
char word[MAX];
while(cmd[i] == ' ' || cmd[i] == '\t'){
i++;
fw++;
}
while(cmd[i] != ' ' && cmd[i] != '\t' && cmd[i] != '\n' && cmd[i] != '[=12=]'){
word[i-fw] = cmd[i];
i++;
}
word[i-fw] = '[=12=]';
char *ret = word;
return ret;
}
为了测试功能,我使用fgets从User(me)中读取了一个字符串,然后打印了三个字符串(frstWrd(input), eatWrd(input), eatWrd(input))。我本以为给定一个字符串,例如 "my name is tim",程序会打印 "my my name",但它会打印第三个单词三次,"is is is":
// now simply test the functions
main()
{
char input[MAX];
fgets(input, MAX - 1, stdin);
printf("%s %s %s", frstWrd(input), eatWrd(input), eatWrd(input));
}
我一遍又一遍地检查我的函数,看不出错误。我相信对于 printf,或者关于使用多个字符串修改函数作为另一个函数中的参数,我只是有些不了解。任何见解都会有所帮助,谢谢。
我看到rest
和word
是函数eatWrd
中的局部变量。因此,return 指向此类内存外部函数的指针是不好的做法。
编辑 1:
你也应该明白,那行
printf("%s %s %s", frstWrd(input), eatWrd(input), eatWrd(input));
函数 eatWrd(input)
可以被调用第一个(在 frstWrd(input)
之前)。
编辑 2:
这在小说中很有用eatWrd
//char rest[MAX]; // rest will hold cmd without the first word
char * rest = (char*) malloc(MAX);
新的主要内容如下:
int main()
{
char input[MAX];
fgets(input, MAX - 1, stdin);
printf("%s ", frstWrd(input));
printf("%s ", eatWrd(input));
printf("%s\n", eatWrd(input));
}
最后我对 frstWrd
的解决方案(只是为了展示标准函数的用处):
char* frstWrd(char * cmd)
{
char * word = (char *) malloc(MAX);
sscanf(cmd, "%s", word);
return word;
}
我创建了以下两个函数。第一个,eatWrd,returns 字符串中没有任何空格的第一个单词,并从输入字符串中删除第一个单词:
MAX 是表示字符串最大长度的数字
char* eatWrd(char * cmd)
{
int i = 0; //i will hold my place in cmd
int count = 0; //count will hold the position of the second word
int fw = 0; //fw will hold the position of the first word
char rest[MAX]; // rest will hold cmd without the first word
char word[MAX]; // word will hold the first word
// start by removing initial white spaces
while(cmd[i] == ' ' || cmd[i] == '\t'){
i++;
count++;
fw++;
}
// now start reading the first word until white spaces or terminating characters
while(cmd[i] != ' ' && cmd[i] != '\t' && cmd[i] != '\n' && cmd[i] != '[=11=]'){
word[i-fw] = cmd[i];
i++;
count++;
}
word[i-fw] = '[=11=]';
// now continue past white spaces after the first word
while(cmd[i] == ' ' || cmd[i] == '\t'){
i++;
count++;
}
// finally save the rest of cmd
while(cmd[i] != '\n' && cmd[i] != '[=11=]'){
rest[i-count] = cmd[i];
i++;
}
rest[i-count] = '[=11=]';
// reset cmd, and copy rest back into it
memset(cmd, 0, MAX);
strcpy(cmd, rest);
// return word as a char *
char *ret = word;
return ret;
}
第二个,frstWrd,只是returns第一个词,不修改输入字符串:
// this function is very similar to the first without modifying cmd
char* frstWrd(char * cmd)
{
int i = 0;
int fw = 0;
char word[MAX];
while(cmd[i] == ' ' || cmd[i] == '\t'){
i++;
fw++;
}
while(cmd[i] != ' ' && cmd[i] != '\t' && cmd[i] != '\n' && cmd[i] != '[=12=]'){
word[i-fw] = cmd[i];
i++;
}
word[i-fw] = '[=12=]';
char *ret = word;
return ret;
}
为了测试功能,我使用fgets从User(me)中读取了一个字符串,然后打印了三个字符串(frstWrd(input), eatWrd(input), eatWrd(input))。我本以为给定一个字符串,例如 "my name is tim",程序会打印 "my my name",但它会打印第三个单词三次,"is is is":
// now simply test the functions
main()
{
char input[MAX];
fgets(input, MAX - 1, stdin);
printf("%s %s %s", frstWrd(input), eatWrd(input), eatWrd(input));
}
我一遍又一遍地检查我的函数,看不出错误。我相信对于 printf,或者关于使用多个字符串修改函数作为另一个函数中的参数,我只是有些不了解。任何见解都会有所帮助,谢谢。
我看到rest
和word
是函数eatWrd
中的局部变量。因此,return 指向此类内存外部函数的指针是不好的做法。
编辑 1:
你也应该明白,那行
printf("%s %s %s", frstWrd(input), eatWrd(input), eatWrd(input));
函数 eatWrd(input)
可以被调用第一个(在 frstWrd(input)
之前)。
编辑 2:
这在小说中很有用eatWrd
//char rest[MAX]; // rest will hold cmd without the first word
char * rest = (char*) malloc(MAX);
新的主要内容如下:
int main()
{
char input[MAX];
fgets(input, MAX - 1, stdin);
printf("%s ", frstWrd(input));
printf("%s ", eatWrd(input));
printf("%s\n", eatWrd(input));
}
最后我对 frstWrd
的解决方案(只是为了展示标准函数的用处):
char* frstWrd(char * cmd)
{
char * word = (char *) malloc(MAX);
sscanf(cmd, "%s", word);
return word;
}