C中的char函数应该返回什么?
我想知道char函数应该返回什么 以这段代码为例:C中的char函数应该返回什么?,c,function,pointers,char,scanf,C,Function,Pointers,Char,Scanf,我想知道char函数应该返回什么 以这段代码为例: #include <stdio.h> char *convert(char *str); int main() { char *str[1000]; printf("Enter a string: "); scanf("%[^\n]s", str); printf("\nOutput: %s\n", str); convert(str); printf("\nAfter conv
#include <stdio.h>
char *convert(char *str);
int main() {
char *str[1000];
printf("Enter a string: ");
scanf("%[^\n]s", str);
printf("\nOutput: %s\n", str);
convert(str);
printf("\nAfter converting to lowercase: %s\n\n", str);
return 0;
}
char *convert(char *str) {
int i = 0;
char *p;
char *c;
while (str[i] != '\0') {
if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] = str[i] + 32;
}
i++;
}
for (p = c = str; *p != '\0'; p++) {
*c = *p;
if (*c < '0' || *c > '9') {
c++;
}
}
*c = '\0';
return str;
}
我在char*convert函数中返回str,但即使我不返回任何内容或返回0,此代码也可以正常工作。我应该将此函数更改为void吗?这段代码可以吗?我应该将此函数更改为void吗?这个代码行吗
您总是希望将函数的返回类型与函数的预期使用方式相匹配。从convert返回char*没有问题。由于在convert中不更改str的地址,因此可以选择将return用作另一个函数的参数,例如:
printf("\nAfter converting to lowercase: %s\n\n", convert (str));
如果您已将convert声明为void,那么这将不再是一个选项。但是,通过返回str,您也无法更改str在函数中的位置。例如,在转换为小写时,您不能简单地在函数中增加str++,这不是一个限制,只是需要注意。真的,两种方法都可以
至于convert函数本身,它不会压缩它在str中删除的数字两侧的空格。例如,如果输入字符串:
My dog HAS 23 Fleas
作为输入,您将收到:
my dog has fleas
作为输出,字符串中仍然存在23任一侧的双空格。您可以通过添加跟踪连续空格的标志或添加其他测试来清除此问题
我的最后一点意见是将convert重构为两个函数,一个用于转换为小写,比如str2lower,另一个用于删除数字,比如strrmdigits。允许您独立地重用这些函数。有很多次您想要转换为小写,可能有一些您想要删除数字,但是很少有次您想要转换为小写并从字符串中删除数字。所以在分解代码时要提前考虑
将您的转换拆分为str2lower和strrmdigits可以如下所示:
char *str2lower (char *str) /* convert string to lower case */
{
for (char *p = str; *p; p++)
if ('A' <= *p && *p <= 'Z')
*p ^= ('A' ^ 'a'); /* works for ASCII & EBCDIC */
return str;
}
示例使用/输出
仔细检查一下,如果您还有其他问题,请告诉我。请打开编译器警告-您至少有一个非常明显的错误,如果您允许,编译器会很高兴地警告您。您忽略了调用中的返回值,因此返回什么都无所谓。char*str[1000];您真的想要一个指向其中char 1000的指针数组,还是想要一个char数组,比如char str[1000]=;可以存储最多999个字符+1个nul终止符的字符串??
char *strrmdigits (char *str) /* remove included digits */
{
char *p = str; /* pointer used to elminate digits */
int nspace = 0; /* flag tracking consequtive spaces */
for (int i = 0; str[i]; i++) /* loop over each char */
if (str[i] < '0' || '9' < str[i]) { /* digit? */
if (str[i] != ' ') { /* if not a space */
*p++ = str[i]; /* write character */
nspace = 0; /* set space count 0 */
} /* otherwise */
else if (!nspace) { /* no space written yet? */
*p++ = str[i]; /* write space */
nspace = 1; /* set space written flag */
}
}
*p = 0; /* nul-terminate at p */
return str;
}
#include <stdio.h>
#define MAXC 1000 /* if you need a constant, #define one (or more) */
char *str2lower (char *str);
char *strrmdigits (char *str);
int main (void) {
char str[MAXC] = ""; /* initialize all strings zero */
printf ("Enter a string: ");
if (scanf ("%999[^\n]s", str) != 1) { /* always validate return */
fputs ("error: invalid input.\n", stderr);
return 1;
}
printf ("\nOutput: '%s'\n\n", str);
printf ("to lowercase : '%s'\n\n", str2lower (str));
printf ("digits removed: '%s'\n", strrmdigits (str));
return 0;
}
$ ./bin/charrtn
Enter a string: My dog HAS 23 Fleas
Output: 'My dog HAS 23 Fleas'
to lowercase : 'my dog has 23 fleas'
digits removed: 'my dog has fleas'