首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改字符串数组中的单个字符?

如何更改字符串数组中的单个字符?
EN

Stack Overflow用户
提问于 2020-06-06 15:02:42
回答 1查看 61关注 0票数 1

有这种情况:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

char *up(char *);

int main() {
    char initstr[20];
    printf("enter string\n");
    fgets(initstr, 20, stdin);

    char *str = up(initstr);
    printf("%s\n", str);
}

char *up(char *in) {
    char *ret;
    for (ret = in;
         *in != '\n'; 
         *(ret++) = toupper(*(in++))
        );
    return ret;
}

将其运行为:

代码语言:javascript
复制
$./a.out
enter string
abc

#only new line from `printf("%s\n",str);`

调试器

代码语言:javascript
复制
Hardware watchpoint 3: in

Old value = 0x7fffffffdc20 "abc\n"
New value = 0x7fffffffdc21 "bc\n"

Hardware watchpoint 2: ret

Old value = 0x7fffffffdc20 "abc\n"
New value = 0x7fffffffdc21 "bc\n"

Hardware watchpoint 3: in

Old value = 0x7fffffffdc21 "bc\n"
New value = 0x7fffffffdc22 "c\n"

Hardware watchpoint 2: ret

Old value = 0x7fffffffdc21 "bc\n"
New value = 0x7fffffffdc22 "c\n"
...

我可以看到这两个变量都在减少,但我想将ret内嵌的char改为char。但是在结束时(后循环),ret被减少到零,并且程序只输出\n。那么,如何在循环头中实现这一点呢?

编辑:感谢下面的回答,考虑到我必须返回指针的第一个地址,我可以通过以下方式实现循环_head函数:

代码语言:javascript
复制
char *up(char *in){
    char *ret;
    size_t size=strlen(in);
    for(ret=in;
         *in!='\n'; 
         *(ret++)=toupper(*(in++))
        );
    return (ret-size+1);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-06 15:21:09

up中的错误是一直递增ret到换行符(\n),并返回指向字符串中这个字符的ret。相反,应该返回指向初始字符的指针。

使用索引编写此函数要简单得多。使用空体将所有逻辑打包到for子句中的

  • 很难读懂,而且容易出错。

  • 还指出,字符串可能不包含换行符,所以在空终止符处停止是更安全的,所以换行符不应由更改,您不应该将char值传递给toupper(),因为此函数和来自<ctype.h>的所有函数仅定义为unsigned char和特殊负值EOF的值。在默认情况下对char进行签名的平台上,字符串可能包含负char值,在传递给toupper()时可能会导致未定义的行为。将它们转换为(unsigned char)以避免此问题.

以下是修改后的版本:

代码语言:javascript
复制
#include <ctype.h>
#include <stdio.h>

char *up(char *s) {
    for (size_t i = 0; s[i] != '\0'; i++) {
         s[i] = toupper((unsigned char)s[i]);
    }
    return s;
}

int main() {
    char initstr[20];
    printf("enter string\n");
    if (fgets(initstr, sizeof initstr, stdin)) {
        char *str = up(initstr);
        printf("%s\n", str);
    }
    return 0;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62233572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档