今天我试图用char *字符串友好...但似乎我失败了:) 每当我调用strcmp / strncmp / strcpy函数时,我的源代码都会被破坏......
这是片段
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
int UID;
char name[20];
char surname[20];
};
char * getString(int minChars, int maxChars);
struct student * myStud;
int main(int argc, char** argv) {
myStud = (struct student*)malloc(sizeof(struct student));
while(1)
{
printf("\nEnter new name: ");
strcpy(myStud->name,getString(1,19));
printf("\n The values is now %s",myStud->name);
}
return (EXIT_SUCCESS);
}
char * getString(int minChars, int maxChars)
{
char string[maxChars+1];
scanAgain:
scanf("%s",&string);
if(strlen(string)<minChars)
{
printf("\nToo few symbols, try again: ");
goto scanAgain;
}
if(strlen(string)>maxChars)
{
printf("\nToo many symbols, try again: ");
goto scanAgain;
}
string[maxChars]='\0';
return(string);
}
输出:
Enter new name: Alekasdasd
The values is now Alekasda�#
Enter new name:
我只是一个初学者,所以它可能是非常简单的......可能不是。 哦顺便说一句,使用linux和netbeans作为SDK,gcc作为编译器。
答案 0 :(得分:3)
您正在返回指向堆栈变量的指针。
char * getString(int minChars, int maxChars)
{
char string[maxChars+1];
当getString返回时,string
无效。您的返回值指向此无效字符串。
使用:
char * getString(int minChars, int maxChars, char * string) {
return string;
}
...
char string[100];
getString(1, 2, string);
另外,goto
?请停止 - 使用for
,while do
,do while
但不是goto
答案 1 :(得分:2)
char * getString(int minChars, int maxChars)
{
char string[maxChars+1];
...
return(string);
}
此处的“string”数组仅分配给getString()函数的范围。一旦它返回(超出范围),它就不再存在,并将被你的程序的其余部分覆盖。 “return(string)”语句返回此数据的指针,不再分配 - 而不是数据本身。这是由于C中的隐式数组到指针转换而发生的。
而不是这样做,你的getString()函数应该将char *作为参数,它在调用函数中分配。
答案 2 :(得分:1)
我发现你的getString()函数存在两个问题:
static
,以便在函数返回时不会释放(堆栈,弹出)用于它的内存。&
标记,而只需要指向缓冲区的指针string
。即改变行:
char string[maxChars+1];
scanf("%s",&string);
阅读
static char string[maxChars+1];
scanf("%s",string);
您不希望在scanf()
调用中使用“&”符号的原因如下所示:手册页man 3 scanf
:
s Matches a sequence of non-white-space characters; the next pointer must be a **pointer to character array** that is long enough to hold the input sequence and the terminating null character ('\0'), which is added automatically. The input string stops at white space or at the maximum field width, whichever occurs first.
答案 3 :(得分:0)
240行不是“片段”。 正如詹姆斯在评论中建议的那样,将代码减少到重现问题所需的最小行数。在那个阶段,问题的原因应该对你来说很明显 - 如果不是再尝试发布。