【问题标题】:Getting unexpected results for array of strings when using = operator [duplicate]使用 = 运算符时获得字符串数组的意外结果[重复]
【发布时间】:2017-11-23 21:27:53
【问题描述】:

在下面的代码中,我得到了意想不到的结果。在第一次迭代期间,s[0] 被打印为第一个元素。但是在剩余的迭代中,0 被打印出来。使用 = 运算符而不是 strcpy 是错误的吗?我尝试使用 strcpy 但它导致分段错误。为什么会打印错误的值?

int main() {
    int n, i;
    scanf("%d", &n);
    int c, j;
    char* s[n];
    char* ch = (char*)malloc(100);
    for (i = 0; i < n; i++) {
        scanf("%s", ch);
        s[i] = strdup(ch);
    }

    char* final[n];
    int count[n];
    for (i = 0; i < n; i++) {
        final[i] = "";
        count[i] = 0;
    }
    int end;
    for (i = 0; i < n; i++) {
        end = 0;
        while (1) {
            printf("%s\n", s[0]);
            if (strcmp(final[end], "")) {
                count[end]++;
                final[end] = s[i];
                // printf("%s\n",final[end]);
                end++;
                break;
            }
            else if (strcmp(final[end], s[i])) {
                final[end] = s[i];
                sprintf(final[end], "%d", count[end]);
                count[end]++;
                end++;
                break;
            }
            end++;
        }
    }
    for (i = 0; i < n; i++) {
        // printf("%s\n",final[i]);
    }
    return 1;
}

【问题讨论】:

  • 等等...n是什么?
  • 程序应该做什么?
  • @Aconcagua 添加到我的评论中,对未普遍同意的事情提出反驳是一件好事。我只是认为这与 C 思维方式C++ 思维方式 有关。为了支持这一点,请考虑指针转换在 C++ 中很常见(因为继承),但通常是 C 中未定义行为的标志(您应该在此处使用具有公共初始序列的结构联合)。一个好的 C 程序通常不会在指针类型之间进行一次强制转换。
  • @Aconcagua 我非常了解 C++ 强制转换运算符,我认为它们在某种程度上支持我的上述论点?经典的套接字 API 是一团糟,实际上是糟糕的 C 代码示例。

标签: c arrays string strcpy


【解决方案1】:
if (strcmp(final[end], ""))

如果final[end] 与空字符串相等,则strcmp 返回0
if 条件中的 0 表示 false,因此不执行 if 块。我相信你希望它被执行。所以你应该这样做

if (strcmp(final[end], "") == 0)

这同样适用于else if 语句。

【讨论】:

  • 你的意思是== 0...
  • 是的,确实如此。感谢您纠正我的大脑扭曲。
  • 天啊.. 太傻了.. 谢谢
猜你喜欢
  • 2022-11-25
  • 2018-02-04
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
相关资源
最近更新 更多