【问题标题】:Wrong output from tolower functiontolower 函数输出错误
【发布时间】:2016-11-05 19:39:01
【问题描述】:

我的下层功能有问题。尝试将它与 argv 一起使用,但输出为 $0@。我的代码有什么问题?

#include <stdlib.h>
#include <stdio.h>

void makeLower(char *s) {
    int i;
    for(i = 0; s[i] != '\0'; i++){
        s[i] = tolower(s[i]);
        }
        printf("%s", s);
}

int main(int argc, char *argv[]) {
    argv[0]="A";

    makeLower(argv);
    return 0;
}

【问题讨论】:

  • 您无法可靠地写入字符串文字;这样做时会调用未定义的行为。例如,将 main() 更改为 int main(void) { char str[] = "A"; makeLower(str); return 0; }。您应该在printf() 中添加一个换行符;您可能应该在 main() 函数而不是(不再是通用的)实用程序函数中打印。从技术上讲,您应该将包含unsigned char 或EOF 的int 传递给tolower()(通常由tolower((unsigned char)s[i]) 实现)。但是,您不会遇到A 的问题。
  • 也许你的误解已经是你试图分配一些东西给argv[0]。这些应该包含来自您的环境的信息,特别是 argv[0] 应该是您编译程序的名称。如果您只是在没有分配给"A" 的情况下运行它,那么一切都应该可以正常工作,argv 指向的字符串是可修改的。

标签: c argv argc tolower


【解决方案1】:

argv 是一个指向指针的指针,即char**。但该函数采用char*。所以,你需要像这样传递:

makeLower(argv[0]);

但这行不通,因为argv[0] 现在指向一个字符串文字。修改字符串文字是undefined

而是传递一个可修改的数组,例如:

int main(int argc, char *argv[]) {
    char arr[] = "A";

    makeLower(arr);
    return 0;
}

其他选项是复制传递的字符串文字(通过argv[0]),然后您就可以对其进行修改。基本上,这个想法是你不能合法地修改 C 中的字符串文字。

【讨论】:

  • 这仍然没有解决 argv。
  • @KenIngram 不清楚。你能解释一下关于 argv 没有解决的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2011-03-25
  • 2019-01-19
相关资源
最近更新 更多