【发布时间】:2015-07-11 20:47:55
【问题描述】:
首先让我说,我确实意识到有很多问题的标题完全相同,但我没有在其中任何一个中找到我想要的东西。我尝试编写以下代码,以错误检查用户的输入,因此他不会给 2 个变量提供相同的名称。不用说,它失败了,这就是我在这里的原因。在打印我作为字符串比较的字符串时,使用printf("%s", temp[j].name); 工作正常,逐字符打印输出一系列字符,据我所知,这些字符不应该存在。我想知道这可能是关于什么的,如果有办法解决它,那么我实际上可以比较两者,而无需使用 string.h
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define ARRAYLENGTH 20
typedef struct{
char name[ARRAYLENGTH];
char type[ARRAYLENGTH];
char value[ARRAYLENGTH];
}variable;
int main(){
int amount = 3;
int i, j, k;
variable * varray;
variable * temp;
int flag;
int added = 1;
varray = malloc(amount*sizeof(variable));
if (varray == NULL){
printf("error");
return 1;
}
temp = malloc(amount*sizeof(variable));
if (temp == NULL){
printf("error");
return 1;
}
printf("Give the name of variable # 1 \n");
scanf("%s", varray[0].name);
for (i = 1; i < amount; i++){
flag = 0;
while (flag == 0){
printf("Give the name of variable # %d \n", i + 1);
scanf("%s", temp[i].name);
for (j = 0; j < added; j++){
for (k = 0; temp[i].name[k] != '\0'; k++){
printf("%c,", temp[i].name[k]);
}
printf("\n");
for (k = 0; temp[i].name[k] != '\0'; k++){
if (varray[j].name[k] != temp[i].name[k]){
flag = 1;
break;
}
if (varray[j].name[k] == temp[i].name[k]){
flag = 0;
}
}
}
if (flag == 0){
printf("The variable name you gave already exists, please choose another one. \n");
}
if (flag == 1){
for (j = 0; j < ARRAYLENGTH; j++){
varray[i].name[j] = temp[i].name[j];
}
}
if(flag == 1){
added +=1;
}
}
}
for (i = 0; i < amount; i++){
printf("%s \n", varray[i].name);
}
free(varray);
free(temp);
}
代码编译没有问题,但是当我尝试运行它时,我发现无论我作为用户输入什么,最终标志总是为1。代码块
printf("\n");
for (k = 0; k < ARRAYLENGTH; k++){
printf("%c,", temp[i].name[k]);
}
printf("\n");
当用户输入的是名字 John 时,在 Visual Studio 2013 的开发人员命令提示符下输出以下内容:
Give the name of variable # 1
John
Give the name of variable # 2
John
J,o,h,n,
The variable name you gave already exists, please choose another one.
Give the name of variable # 2
George
G,e,o,r,g,e,
Give the name of variable # 3
George
G,e,o,r,g,e,
G,e,o,r,g,e,
The variable name you gave already exists, please choose another one.
Give the name of variable # 3
John
J,o,h,n,
J,o,h,n,
John
George
John
我猜这个问题是关于系统分配给temp 和varray 的内存已经在其他地方使用了。这种错误检查对于我必须做的项目至关重要,因此我将不胜感激能在很大程度上解决这个问题的任何帮助。提前致谢,
卢克塞克佩
【问题讨论】:
-
问题是您打印的字数超过了字尾。你总是打印
ARRAYLENGTH字符,即使这个词只有4 个字符长。当你到达空字符时,你需要停下来。 -
@Barmar 是正确的。试试
for (k = 0; k < ARRAYLENGTH && temp[i].name[k] != '\0'; k++)
标签: c string dynamic-memory-allocation