C 使用=运算符时获取字符串数组的意外结果

C 使用=运算符时获取字符串数组的意外结果,c,arrays,string,strcpy,C,Arrays,String,Strcpy,在下面的代码中,我得到了意想不到的结果。在第一次迭代中,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 <

在下面的代码中,我得到了意想不到的结果。在第一次迭代中,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;
}
intmain(){
int n,i;
scanf(“%d”和“&n”);
int c,j;
字符*s[n];
char*ch=(char*)malloc(100);
对于(i=0;i
strcmp
返回
0
if
final[end]
与空字符串的比较相等。
if
条件中的
0
表示
false
,因此不执行if块。我相信你想要执行它。所以你应该这么做

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

这同样适用于
else if
语句。

等等,
n
是什么?程序应该做什么?@Aconcagua补充到我的评论中,对一些没有得到普遍认可的东西提出反论点是一件好事。我只是认为这与C思维方式和C++思维方式有关。为了支持这一点,考虑指针的类型在C++中是常见的(因为继承),但是在C中通常是一个未定义行为的标志(这里应该使用具有一个共同的初始序列的结构的结合)。一个好的C程序通常在指针类型之间没有一个单一的转换。@阿空加瓜山,我非常了解C++的CAST操作符,我想它们有点支持我上面的论点。顺便说一句,经典的套接字API非常混乱,实际上是坏C代码的一个例子。你的意思是
==0
…是的,的确如此。谢谢你纠正我的大脑扭曲。哦,天哪。。那太傻了。。谢谢
if (strcmp(final[end], "") == 0)