我有以下部分代码:
for(int i=0;i<n;i++)
{
printf("Student %d\n",i+1);
printf("Enter name : ");
scanf("%s",&(student+i)->name);
fflush(stdin);
lengthName = strlen((student+i)->name);
while(lengthName !='\0')
{
}}
当长度小于10时,它将添加连字符,直到达到最大尺寸。 例如:约翰=&gt;&gt;将添加6个连字符
我知道如何在csharp中做到这一点,但无法在c中弄明白。 你们有些人可以给我一些灯吗?
PS:哦,是的,变量名是char name [10 + 1],它是名为student的结构的一部分。
答案 0 :(得分:3)
这很简单,似乎我必须遗漏一些东西。
lengthName = strlen(student[i].name);
while (lengthName < 10)
student[i].name[lengthName++] = '-';
student[i].name[lengthName] = '\0';
也许你对C#(推测)拥有一流的字符串类型感到困惑?在C中没有这样的东西,只有裸露的字符数组;这很乏味(你必须自己做所有的记忆管理)和解放(如上所述)。
答案 1 :(得分:1)
这个怎么样?
// Pre-fills with hyphens.
memset(student[i].name, '-', sizeof(student[i].name) - 1);
scanf("%10s", student[i].name);
答案 2 :(得分:1)
while(lengthName < 10)
{
student[i]->name[lengthName++] = '-'; // add this line
}
student[i]->name[lengthName] = 0; // and this line
答案 3 :(得分:0)
尝试以下方法:
while (lengthName < 10)
{
(student+i)->name[lengthName++] = '-';
}
答案 4 :(得分:0)
您的char name[10 + 1];
变量显然是11个字节长。添加超过11个字节的任何内容都会导致缓冲区溢出。
这可能是缓冲区溢出的地方:
scanf("%s",&(student+i)->name);
修复此可能的缓冲区溢出问题后,可以使用连字符功能。
解决此类问题的一种简单方法是让scanf本身限制要读取的字符数:
// read only 10 chars, since `name` can only
// hold 10 chars, plus the extra NULL char
scanf("%10s", &(student+i)->name);
最后,在你处理了你的记忆问题之后,你可以继续预先填写你的字符串,然后用实际的学生数据覆盖它。
// pre-fill your data with hypens.
memset((student+i)->name, '-', sizeof((student+i)->name) - 1);
// read only 10 chars, since `name` can only
// hold 10 chars, plus the extra NULL char
scanf("%10s", &(student+i)->name);
答案 5 :(得分:0)
@ kotlinski的修改版本的想法:
#define NAME_SIZE 10
fgets(student[i].name, NAME_SIZE, stdin);
lengthName = strlen(student[i].name);
if (lengthName > 0 && student[i].name[lengthName-1] == '\n') {
--lengthName;
}
if (lengthName < NAME_SIZE) {
memset(student[i].name + lengthName, '-', NAME_SIZE - lengthName);
student[i].name[NAME_SIZE] = '\0';
}
答案 6 :(得分:0)
使用fgets()
读取输入,并了解如果有空间,它会将换行符保存到缓冲区;你必须为此添加一些特殊处理。
请注意,输入流的fflush()
行为未定义;您无法通过调用fflush(stdin);
来清除不需要的输入。
然后将剩余字符设置为连字符。
if (fgets(students[i].name, sizeof students[i].name, stdin) != NULL)
{
size_t max = sizeof students[i].name - 1;
size_t len = 0;
char *newline = strchr(students[i].name, '\n');
if (newline)
*newline = 0; // clear out newline
else
{
while (fgetc(stdin) != '\n') // clear out remaining input;
// name potentially truncated
;
}
// pad remainder with hyphens
len = strlen(students[i].name);
while (len < max)
students[i].name[len++] = '-';
students[i].name[max] = 0;
}