我在使用指针和功能部件时遇到了麻烦。我被要求编写函数:char *mytoupper(char *p)
,它将p
指向的字符串转换为大写字母,然后转换为returns
p
。
请注意,我不能使用<string.h>
函数。这是我的方法吗?
#include <stdio.h>
char *mytoupper(char *p);
int main(int argc, char const *argv[]) {
char str[100];
printf("Please enter a string: ");
scanf("%s", str);
mytoupper(str);
printf("The upercased string is: %s\n", str);
}
char mytoupper(char *p) {
char result = *p;
while (*p != '\0') {
if ((*p >= 'a') && (*p <= 'z')) {
*p = *p - 32;
}
p++;
}
return result;
}
请帮助我检查一下。我只编码了一个月。我感谢所有帮助。
答案 0 :(得分:3)
在函数声明中
char *mytoupper(char *p);
您说它返回char *
(指向char的指针)
在您的定义中,您说它仅返回char
char mytoupper(char *p)
两个定义必须匹配,因此将其更改为
char *mytoupper(char *p)
,然后在函数内部不存储第一个字符;存储指向第一个字符的指针并返回它。
char *result = p;
....
return result;
答案 1 :(得分:3)
您的代码将无法编译,并且您会收到错误消息:
main.c:14:6: error: conflicting types for 'mytoupper'
char mytoupper(char *p) {
^
main.c:3:7: note: previous declaration of 'mytoupper' was here
char *mytoupper(char *p);
^
main.c: In function 'main':
main.c:8:5: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
scanf("%s", str);
^
准确指出问题所在。
还有另一个问题,因此请查看已更正的问题(但仅在char是ASCII编码的情况下才有效)
char *mytoupper(char *p)
{
char *savedptr = p;
if(p)
{
while (*p)
{
if ((*p >= 'a') && (*p <= 'z'))
{
*p -= ('a' - 'A');
}
p++;
}
}
return savedptr;
}
答案 2 :(得分:1)
这部分非常依赖平台:
while (*p != '\0') {
if ((*p >= 'a') && (*p <= 'z')) {
*p = *p - 32;
}
p++;
}
好的(便携式)代码并不假定所有字母都是连续的,也不假设a
.. z
之外没有字母,或者小写字母都比大写字母小32。除非您将自己限制为ASCII的美国变体,否则所有这三个假设都是错误的(仅举几个例子,EBCDIC大写字母比小写字母大64个位置,而在非美国语言环境中的ASCII具有诸如{{ 1}}和å
在ø
到a
范围之外。
相反,我们可以使用z
中提供的功能,特别是在<ctype.h>
:
toupper()
请注意,这也解决了#include <stdio.h>
#include <ctype.h>
char *mytoupper(char *p);
/* use (void) when we ignore arguments */
int main(void)
{
char str[100];
printf("Please enter a string: ");
/* scanf("%s") is dangerous! Always */
/* limit input length and check result */
if (scanf("%99s", str) != 1) {
fputs("Failed to read input!\n", stderr);
return 1;
}
mytoupper(str);
/* spelling fixed */
printf("The uppercased string is: %s\n", str);
}
/* Convert the string pointed to by s into uppercase.
s must not be a null pointer */
char *mytoupper(char *const s)
{
for (char *p = s; *p; ++p) {
*p = toupper((unsigned char)*p);
}
return s;
}
中的某些问题-请参阅注释。
答案 3 :(得分:0)
如果要将所有字符都转换为大写,请查看ASCII表。您可能知道,每个字符都有一个整数值。例如,A的值为65。因此,遍历所有元素并检查该值是否大于(int)'a'。如果是这样,则从字符中减去((int)'a'-(int)'A')。
示例
int counter = 0;
while (p[counter] != '\0')
{
if ((int) p[counter] >= (int) 'a')
{
p[counter] -= (int) 'a' - (int) 'A';
}
counter++;
}