如何添加字符以达到char []的最大大小

时间:2010-12-21 16:27:44

标签: c char

我有以下部分代码:

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的结构的一部分。

7 个答案:

答案 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;
}