strcmp在c中返回相同的值

strcmp在c中返回相同的值,c,gcc,strcmp,C,Gcc,Strcmp,我在这里写了一个程序,它产生了两组与之相连的编号单词,这样以后我们可以通过组合这些单词来生成单词(每组分别),每次我们生成这两个单词时,它会比较它们,如果这些单词是相同的,如果它们是相同的,程序结束 strcmp没有正常工作,我不知道为什么:…C 你能帮我吗 我在Ubuntu 14.04 LTS上使用代码::块 当然,下面是代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #def

我在这里写了一个程序,它产生了两组与之相连的编号单词,这样以后我们可以通过组合这些单词来生成单词(每组分别),每次我们生成这两个单词时,它会比较它们,如果这些单词是相同的,如果它们是相同的,程序结束

strcmp没有正常工作,我不知道为什么:…C 你能帮我吗

我在Ubuntu 14.04 LTS上使用代码::块 当然,下面是代码:

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

#define LISTSIZE 256
#define CHAINSIZE 64

int main()
{
char listA[LISTSIZE][CHAINSIZE], listB[LISTSIZE][CHAINSIZE]; //i know malloc would be nice here but it's not really important here
int j = 0, i = 0, n;
printf("Podaj wartość indeksu i: ");
scanf("%d", &i);

for(j = 0 ; j < i; j++)
{
    printf("Podaj łańcuch do listy A: "); //enter chain to list A
    scanf("%s", &listA[j]);

}
for( j = 0; j < i; j++)
{
    printf("Podaj łańcuch do listy B: "); //enter chain to list B
    scanf("%s", &listB[j]);
}
printf("Ile chesz podać indeksów? "); //how much indexes do you like to choose
scanf("%d", &n);
for (j = 0; j < n; j++)
{
    printf("\nWpisz index", j); //enter index
    scanf("%d", &i);
    strcat(listA[LISTSIZE - 1], listA[i - 1]);
    strcat(listB[LISTSIZE - 1], listB[i - 1]);
    printf("\nslowo A: %s", listA[LISTSIZE - 1]);
    printf("\nslowo B: %s", listB[LISTSIZE - 1]);
    printf("\n %d", strcmp(listA[LISTSIZE - 1], listB[LISTSIZE - 1])); //just to check
// here i have a problem
    if(strcmp(listA[LISTSIZE - 1], listB[LISTSIZE - 1]) == 0)
    {
        printf("\tRozwiązanie zostało znalezione!\n");
        return 0;
    }
}
printf("Nie znaleziono rozwiązania"); //no solution was found
return 0;
}
#包括
#包括
#包括
#定义列表大小256
#定义链大小64
int main()
{
char listA[LISTSIZE][CHAINSIZE],listB[LISTSIZE][CHAINSIZE];//我知道malloc在这里会很好,但在这里并不重要
int j=0,i=0,n;
printf(“Podaj wartośćindeksu i:”);
scanf(“%d”、&i);
对于(j=0;j
这是你的问题

scanf("%s", &listA[j]);
卸下
&

scanf("%s", listA[j]);

并修复
listB
案例

另外,不要像那样调用
scanf
,这样做可以防止缓冲区溢出

scanf("%63s", listA[j]);

并检查
scanf的返回值
如果不检查,可能会调用未定义的行为。

listA
listB
应该为
strcat(listA[LISTSIZE-1],listA[i-1])初始化;strcat(listB[LISTSIZE-1],listB[i-1])


关于这句话:“char listA[LISTSIZE][CHAINSIZE],listB[LISTSIZE][CHAINSIZE];”大变量应该放在文件全局空间中,而不是堆栈上。(有很多文件全局空间,只有有限的堆栈)建议:静态char listA[LISTSIZE][CHAINSIZE],listB[LISTSIZE][CHAINSIZE];关于这类行:'scanf(“%s”,&listA[j]);'1) 限制输入字符串的长度,以免发生缓冲区溢出:建议类似于:scanf(“%63s”,&listA[j]);2) 应始终检查scanf返回的值,以确保针对此类行的输入/转换操作成功:“strcat(listA[LISTSIZE-1],listA[i-1]);”这将始终将listA[]字符串附加到listA[]中的最后一个条目。这可能不是我们想要的。当listA[LISTSIZE-1]中的可用空间已满时,进一步追加会导致缓冲区溢出和未定义的行为,可能会导致seg错误事件。此行:“scanf(“%s”),&listB[j])会引发编译器警告:“scanf(“%s”,listB[j])”。“scanf(“%s”,&listB[j])的相似性原因是listB[x]实际上是一个字符数组,C将其降级为指向字符的指针。因此指针已经可用。如果在编译时启用了所有警告,则会看到这些警告。(警告需要更正,不能忽略)这一行:“printf(“\nWpisz index”,j);”具有第二个参数,但格式字符串中没有转换格式规范。这将导致编译器警告。如果编译时启用了所有警告,则会看到此警告。(警告需要更正,而不是忽略)
scanf("%63s", listA[j]);
char listA[LISTSIZE][CHAINSIZE]={0}, listB[LISTSIZE][CHAINSIZE]={0};
scanf("%s", listA[j]);
...
scanf("%s", listB[j]);